1、NSObject的多线程方法(用的时候要用@autoreleasepool{}包起来)面试
开启后台执行任务的方法:多线程
- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg.net
苹果底层容许使用performSelectorInBackground方法在后台线程更新UI,强烈不建议这么作!线程
在后台线程中通知主线程执行任务的方法:orm
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait对象
wait参数:内存
YES:会阻塞住线程,直到调用方法完成作用域
NO:不会阻塞线程,主线程其余任务会继续执行开发
获取线程信息:get
[NSThread currentThread]
线程休眠:
[NSThread sleepForTimeInterval:2.0f];
设置线程休眠了2秒
特色:
使用简单,量级轻
不能控制线程的数量以及执行顺序
2、NSObject的多线程方法注意事项
NSObject的多线程方法使用的是NSThread的多线程技术。
而NSThread的多线程技术不会自动使用@autoreleasepool。
在使用NSObject或NSThread的多线程技术时,若是涉及到对象分配,须要手动添加@autoreleasepool 。
iOS开发中的内存管理:
(1) 在iOS开发中,并无JAVA或C#中的垃圾回收机制
(2) 使用ARC开发,只是在编译时,编译器会根据代码结构自动添加了retain、release和autorelease
自动释放池的工做原理:
(1)标记为autorelease的对象在出了做用域范围后,会被添加到最近一次建立的自动释放池中
(2)当自动释放池被销毁或耗尽时,会向自动释放池中的全部对象发送release消息
(3)每一个线程都须要有@autoreleasepool ,不然可能会出现内存泄漏,可是使用NSThread多线程技术,并不会为后台线程建立自动释放池
4、自动释放池常见面试代码
for (int i = 0; i < 10; ++i) {
NSString *str = @"Hello World";
str = [str stringByAppendingFormat:@" - %d", i];
str = [str uppercaseString];
NSLog(@"%@", str);
}
问:以上代码存在什么样的问题?若是循环的次数很是大时,应该如何修改?
答:循环建立了NSString对象,循环次数过多容易致使内存泄漏。若是循环次数比较大,能够用@autoreleasepool{}把整个循环包起来,若是每一次循环都会致使内存泄漏,则把循环内容用@autoreleasepool{}包起来。