NSThread详解

来源:互联网 发布:apache自定义404页面 编辑:程序博客网 时间:2024/05/16 15:14

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 allocinitWithContentsOfURL:[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:

当第一个线程启动时,广播这个通知。

0 0
原创粉丝点击