为什么我的线程的保留计数= 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
答案 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
会保留该主题。