NSThread
使用NSThead创建线程有很多方法:
- +detachNewThreadSelector:toTarget:withObject:类方法直接生成一个子线程
1
| |
- 创建一个NSThread类实例,然后调用start方法。
1 2 | |
- 调用NSObject的
+performSelectorInBackground:withObject:
方法生成子线程。
1
| |
- 创建一个NSThread子类,然后调用子类实例的start方法,。
创建线程也是有开销的,iOS下主要成本包括构造内核数据结构(大约1KB)、栈空间(子线程512KB、主线程1MB,不过可以使用方法-setStackSize:
自己设置,注意必须是4K的倍数,而且最小是16K),创建线程大约需要90毫秒的创建时间。
第二种和第四种方法创建的线程有个好处是拥有线程的对象,因此可以使用performSelector:onThread:withObject:waitUntilDone:
在该线程上执行方法,这是一种非常方便的线程间通讯的方法(相对于设置麻烦的NSPort用于通讯),所要执行的方法可以直接添加到目标线程的Runloop中执行。Apple建议使用这个接口运行的方法不要是耗时或者频繁的操作,以免子线程的负载过重。
第三种方法其实与第一种方法是一样的,都会直接生成一个子线程。
上面四种方法生成的子线程都是detached状态,即主线程结束时这些线程都会被直接杀死;如果要生成joinable状态的子线程,只能使用pthread接口啦。
如果需要,可以设置线程的优先级(-setThreadPriority:
);如果要在线程中保存一些状态信息,还可以使用到-threadDictionary
得到一个NSMutableDictionary,以key-value的方式保存信息用于线程内读写。