1. NSThread 创建:
1)- (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument
Parameterstargetselector:消息发送的对象selector线程执行的方法,这个selector只能有一个参数,而且不能有返回值。
argument:传输给target的唯一参数,也可以是nil
Return Value:返回对象本身.
Discussion:target和argument的计数会加1. 会在线程结束的时候被释放.
DEMO:
- (void)viewDidLoad {
[super viewDidLoad];
// [NSThread detachNewThreadSelector:@selector(downloadImage:) toTarget:self withObject:kURL];
thread = [[NSThread alloc]initWithTarget:self selector:@selector(downloadImage:) object:kURL];
[thread start];
}
-(void)downloadImage:(NSString *) url{
NSData *data = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:url]];
UIImage *image = [[UIImage alloc]initWithData:data];
if(image == nil){
}else{
[self performSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:YES];
}
}
-(void)updateUI:(UIImage*) image{
self.imageView.image = image;
}
2)+ (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument
Parameters同上。
Discussion线程会在target执行完selector以后就退出。
如果是当前线程开启的第一个子线程,会出发默认通知中心的NSWillBecomeMultiThreadedNotification通知。
3)-(void)start;
初始化后,调用start方法开启线程。start方法同时将调用接收者的main()方法。
4)-(void)main
执行start方法后会自动调用main方法。
main是默认的初始化和调用selector的方法。如果要继承NSThread,可以重写main方法来执行新线程的主要部分。重写的mian方法不需要调用super。不要直接调用mian方法,而是通过start方法来调用。
2. NSThread 停止
1)+(void)sleepUntilDate:(NSDate *)aDate
线程休眠到aDate的时候。在休眠期间runLoop 不处理事件
2)+(void)sleepForTimeInterval:(NSTimeInterval)ti
休眠ti秒,休眠期间同上。
3)+(void)exit
类方法,exit方法先执行currentThread类方法来获取当前线程。退出线程前给默认通知中心发送NSThreadWillExitNotification通知,并把当前线程作为参数,因为post通知是同时发送的,所以所有NSThreadWillExitNotification 通知的观察者都会在线程退出之前收到通知。避免调用exit方法,因为exit方法不会给线程回收线程处理期间生成内存的机会。
4)-(void)cancel
改变iscancelled的状态来退出进程。支持取消的线程周期性的调用isCancelled方法,来决定是否退出线程。
3. NSThread 执行状态
1)executing
线程是否在执行
2)finished
线程是否已经执行完成
3)cancelled
线程是否已经取消取消后线程不会立即退出,所以当cancelled为yes时,finished有可能为no。
4. NSThread 与主线程
1)+ (BOOL)isMainThread
是否主线程
2)+ (NSThread *)mainThread
返回主线程。
3)+(BOOL)isMultiThreaded
是否多线程。如果是通过非Cocoa的api开启的线程,比如POSIX或者Multiprocessing Services APIs,被认为不是多线程。
4)+ (NSThread *)currentThread
返回当前线程
5)+ (NSArray *)callStackReturnAddresses
线程函数地址
6)+ (NSArray *)callStackSymbols
当前线程的调用栈。
5. NSThread 属性
1)@property(readonly,retian)NSMutableDictionary *threadDictionary
可以使用返回的字典来保存线程的特定数据。这只是一个普通的字典,用来保存所有开发者感兴趣的数据。
2)@property(copy)NSString *name
保存线程名字。
3)@property NSUInteger stackSize
线程的堆内存大小字节数。必须是4KB的倍数。要使设置有用,必须在start方法调用前设置。
6. NSThread 优先级
1)+ (double)threadPriority
当前线程的优先级,区间在0.0到1.0之间。 典型的是0.5.是内核分配的,所以不确定每次都是0.5.
2)+(BOOL)setThreadPriority:(double)priority
设置当前线程的优先级。当设置成功时,返回YES。
7. NSThread 通知
1)NSThreadWillExitNotification:
当线程对象获取到exit消息时,广播这个通知。
2)NSWillBecomeMultiThreadedNotification:
当第一个线程启动时,广播这个通知。