iOS之多线程2-NSThread使用学习

在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:完成线程创建并启动线程;

posted @ 2014-07-12 09:41  老蔡居士  阅读(589)  评论(0编辑  收藏  举报