在iOS中,让NSThread 启动方法有三种:
1.+ (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument
创建一个新线程,并在线程的入口点使用指定的SEL方法(就是给Target对象发送aSelector消息);
在iOS环境下,方法aSelector会负责创建一个自动释放池给新线程,并一直保持这个自动释放池,直到这个新线程结束.在新线程执行期间,对象aTarget和anArgument都被retain
,当aTarget对象执行完aSelector方法的时候,这个新线程就会结束退出,并在退出之前,释放aTarget和anArgument.
代码样例:(非ARC环境)
1 - (void)viewDidLoad { 2 [super viewDidLoad]; 3 //-- 4 progressView = [[UIImageView alloc] initWithFrame:self.view.bounds]; // 创建进度条 5 [self.view addSubview:progressView]; //将进度条加载到控制器的view中; 6 [progressView release]; // 释放进度条 7 [NSThread detachNewThreadSelector:@selector(downsize:) toTarget:self withObject:nil];
// 创建新的线程,执行控制器(Controller)的downsize:方法,下载图片
// 调用这个方法,会立刻启动线程;
8 }
2.- (void)start
这个方法会创建一个新线程,并且在这个新线程上启动main方法(注意,这里的main方法不是应用程序的main方法);在这个main方法中,系统会自动调用aTarget的aSelector(前提是你给线程对象提供了aTarget和aSelector).
上一份代码也可以使用这个方法:
- (void)viewDidLoad { [super viewDidLoad]; //-- progressView = [[UIImageView alloc] initWithFrame:self.view.bounds]; [self.view addSubview:progressView]; [progressView release]; // [NSThread detachNewThreadSelector:@selector(downsize:) toTarget:self withObject:nil]; NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(downsize:) object:nil];
// 创建线程对象, [thread start];
// 创建新线程,并通过线程内部的main方法,调用控制器的downsize:方法,完成下载图片; }
3.- (void)main
这个方法永远都不要直接手动调用!启动线程应该使用start方法.
苹果提供这个方法但不推荐手动调用的原因之一是,它是系统用来处理线程入口的方法,是给系统用的.系统会根据你提供的target和selector先处理一些事情,然后再启动线程.或者你定义了一个NSThread的派生类的时候,你可以重写这个方法来完成派生类的主要工作,这时候这个派生类就不需要启动父类的main方法了.
本章小结:
<1>永远不要直接调用线程中的main方法;
<2>detachNewThreadSelector: toTarget:withObject:方法和start方法都会创建新线程;
<3>start的本质上是调用了detachNewThreadSelector: toTarget:withObject:完成线程创建并启动线程;