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
- 注意点:线程任务一旦执行完毕或者线程一旦强制退出,不能再重新开启线程,只能重新创建线程。