NSThread保留计数

时间:2015-04-09 07:20:20

标签: ios iphone multithreading object nsthread

为什么我的线程的保留计数= 2? 它在启动方法之后增加为什么?
Retain计数如何适用于NSThreads

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    NSThread *thread;

    @autoreleasepool
    {
        thread = [[NSThread alloc] initWithTarget:self selector:@selector(check) object:nil];
                    NSLog(@"RC == %lu",(unsigned long)[thread retainCount]);
        [thread start];
    }

    NSLog(@"RC == %lu",(unsigned long)[thread retainCount]);
}// presently stopped here on breakpoint

-(void)check{
       for (int i = 0 ; i< 100000; i++) {
           NSLog(@"NEW THREAD ==%d",i);
       }
}

@end

1 个答案:

答案 0 :(得分:1)

这是它的工作原理,正如您所发现的那样:start将保留您的NSThread,以便它通过执行生效。完成后,+[NSThread exit]会减少保留计数。

另一方面,请考虑一下:您正在创建NSThread并将其(保留)引用分配给局部变量。你打算如何减少它?局部变量在viewDidLoad之外不可见,因此您无法释放它。

正确的处理方法是为您的NSThread实例使用ivar,这样您就可以在dealloc中发布它,或使用autorelease d NSThread,指望start将保留该对象的事实。所以你可以:

        - (void)viewDidLoad {
            [super viewDidLoad];

            NSThread *thread;

            @autoreleasepool
            {
                thread = [[[NSThread alloc] initWithTarget:self selector:@selector(check) object:nil] autorelease];
                    NSLog(@"RC == %lu",(unsigned long)[thread retainCount]);
                [thread start];
            }

一切都会正确。

我希望这能解释为什么start会保留该主题。