zoukankan      html  css  js  c++  java
  • 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:完成线程创建并启动线程;

  • 相关阅读:
    (005)每日SQL学习:关于物化视图的一系列创建等语句
    (004)每日SQL学习:物化视图之二
    (003)每日SQL学习:普通视图和物化视图
    (002)每日SQL学习:删除名称重复的数据
    (001)每日SQL学习:关于UNION的使用
    (002)每日一课:表格的数据排序
    (001)每日一课:报表隔行换色
    (Oracle)关于blob转到目标库报ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值错误解决方案
    (Oracle)数据库用户的密码过期时间如何修改为永不过期
    Entity Framework 中遇到的一些小问题
  • 原文地址:https://www.cnblogs.com/caios/p/3839644.html
Copyright © 2011-2022 走看看