Iphone 中的多线程
几十年前黑白的DOS系统,提示符慢慢跳动——这是一种简单的对话模式:系统是在等待一发出的指令--系统响应指令。此时的系统是一个单独的服务员,被命令做某件事的时候,他不会在对别的命令做出响应,直到把自己的命令完成。
但是随着硬件设备的不断发展,拥有内核以后,高效的资源的要求对原有的方式进行了调整,线程也应运而生。
可以这样理解线程:将一份工作分开来做,独立运作。
那么为什么要用多线程呢?
因为单一的线程已经不能满足需求,那就需要添加多个线程进行操作。线程的应用至少有一个主线程,如果在执行任务的时候,主线程开销比较大的时候,就可以给他添加一个子线程,来为主线程分担任务。
1、NSThread:代表执行的线程,可以使用该类的对象分装线程操作。
2、NSOperation:操作对象(Operation Object)的抽象基类,定义了人物的执行环境、状态等基本属性,继承该类来指定具体的操作。
3、NSInvocationOperation:NSOperation的子类,可以指定操作方法。
4、NSOperationQueue:操作队列(Operation queue)的管理者,配合NSOperation的子类对象和NSInvocationOperation对象使用,通过添加操作对象完成并操作。
5、NSRunLoop:表示程序的运行回路(RunLoop),该类的对象可以接受收到各种时间(如来自NSTimer的时间变化)的事件,协助程序对这些事件做出响应。
线程的实现方式
1、NSThread创建线程
NSTread类提供的多线程,可以使用该类创建、管理线程。有以下3种方式可以实现。
(1)、[NSTread detachNewThreadSelector:toTarget:withObject:nil];该方法的三个参数分别指定了线程的方法、目标和传递对象。
(2)创建NSTread对象,NSTread *_thread = [[NSTread alloc] initWithTarget:self selector:@selector(task) object:nil]; [_thread start];
(3)自定义NSTread对象 @interface myThread:NSThread @implementation myThread -(void)main{ // 在这里添加线程方法} myThread *_thread = [[myThread alloc] init]; [myThread start];
2、线程的内存管理
NSAutoreleasePool类的实例管理所有被自动释放(autorelease)的对象。也就是说,当向一个对象发送autorelease消息后,该对象不会被立即释放,而是被放入NSAutoreleasePool实例中,当NSAutorelease实例被释放时,统一释放其中的所有对象,从而完成所谓的“自动释放”。工程中的主函数里,有系统自动创建的NSAutoreleasePool对象,供在主线程运行的对象使用,在创建其它线程的时候,NSAutorelease对象需要用户自己来创建、管理。不适用NSAutoreleasePool的后果是,系统中自动释放的对象无法被释放,像滚雪球一样越积越多,最终造成系统奔溃。
3、使用NSInvocationOperation
NSOperationQueue *queue =[ [NSOperation alloc] init]; [ququ setMaxConcurrentOperationCount;1]; //指定能够同时并发执行的操作个数 NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarger:self selector:@selector(task) object:nil]; [ququ addOperation:op]; //将创建好的operation加入运行队列中。