美文网首页
iOS多线程中的实际方案之二NSThread

iOS多线程中的实际方案之二NSThread

作者: 紫菱清风 | 来源:发表于2016-04-24 11:12 被阅读0次

    NSThread


    • 创建和启动线程的3个方法
      1> 先创建,后启动
    // 创建
    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(download) object:nil];
    // 设置线程的名字
    thread.name = @"下载线程01";
    // 设置线程的优先级(取值 0.0 - 1.0)
    thread.threadPriority = 0.5;
    // 启动
    [thread start];
    -(void) download{
    [self performSelectorOnMainThread:@selector(back:) withObject:@"back" waitUntilDone:NO];
    }
    -(void) back:(id)obj{
      NSLog("%@",obj);
      NSLog("%@,[NSThread currentThread]);
    }
    

    2> 创建完自动启动

    [NSThread detachNewThreadSelector:@selector(download:) toTarget:self withObject:nil];
    

    3> 隐式创建(自动启动)// NSObject开启线程

    [self performSelectorInBackground:@selector(download:) withObject:nil];
    // waitUntilDone:YES 表示当@selector执行完毕后后面的代码才执行。
    [self performSelectorOnMainThread:@selector(download:) withObject:nil waitUntilDone:NO];
    

    4> runloop

    • Runloop是程序启动后建立的一个主运行循环,保证程序不退出,而且还负责监听事件,如触摸,定
      时器、网络请求完成。
    • 没有事件时,进行休眠。
    • 有事件时,被唤醒,接收事件,找到最合适的处理对象。
    • 主线程和子线程的运行循环:
      1)主线程和子线程都有运行循环
      2)主线程的运行循环是工作的 主线程中是有autoreleasepool的
      3)使用GCD和NSOperation创建的线程会添加自动释放池
      4)使用NSThread的线程不会自动添加autoreleasepool
      NSThread和NSObject如果在后台创建了autorelease对象 "需要使用自动释放池 否则会出现内存泄漏",所以前面的代码要加上autoreleasepool
    • 注意点:线程任务一旦执行完毕或者线程一旦强制退出,不能再重新开启线程,只能重新创建线程。

    相关文章

      网友评论

          本文标题:iOS多线程中的实际方案之二NSThread

          本文链接:https://www.haomeiwen.com/subject/ibrfrttx.html