1. NSObject () 一个多线程操作的分类
NSObject 多线程 分类里面的方法, 在后面子线程中执行一个操作
本质是: 帮我们快速创建了一个子线程。把相关操作放到了子线程中执行。
两个方法:
(1) 开启后台执行任务的方法:
[self performSelectorInBackground:@selector(blockThread:) withObject:nil];
(2)开启后台执行任务的方法:
[self performSelectorOnMainThread:@selector(blockThread:) withObject:nil waitUntilDone:NO];
wait参数:YES:会卡主线程,直到调用方法完成才会执行其他任务 NO:不会卡主线程,主线程其他任务会继续执行
2.
获取线程信息:
[NSThread currentThread]
线程休眠:
[NSThread sleepForTimeInterval:2.0f];
NSObject多线程的特点:使用简单,量级轻,不能控制线程的数量以及执行顺序
2、NSObject的多线程方法注意事项
(1)NSObject的多线程方法使用的是NSThread的多线程技术。
(2)而NSThread的多线程技术不会自动使用@autoreleasepool。
(3)使用NSObject或NSThread的多线程技术时,如果涉及到对象分配,需要手动添加@autoreleasepool。
3、@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{}包起来。