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

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)