detachNewThreadSelector是否与NSThread performSelectorInBackground或NSThread alloc / init不同,然后[thread start]

时间:2011-10-07 21:27:45

标签: objective-c nsthread

detachNewThreadSelectorperformSelectorInBackground有什么不同?在我的项目中,我使用了很多:

[self performSelectorInBackground:@selector(startImageDownloads:) withObject:[NSNumber numberWithInt:dataType]];

但这样做会有所不同:

[NSThread detachNewThreadSelector:@selector(startImageDownloads:) toTarget:self withObject:[NSNumber numberWithInt:dataType]];

此外,除了能够使用imgDlThread访问线程对象之外,还会分配/初始化一个线程,然后start它的工作方式与前两个不同:

NSThread *imgDlThread = [[NSThread alloc] initWithTarget:self selector:@selector(startImageDownloads:) object:[NSNumber numberWithInt:dataType]];
[imgDlThread start];

谢谢!


修改

刚刚意识到在performSelectorInBackgrounddetachNewThreadSelector之间已经有几个关于SO的答案已经存在差异(或缺少),所以我想我唯一的问题是:

正在分配和初始化NSThread,然后调用[thread start]与前2个不同的任何不同?

1 个答案:

答案 0 :(得分:1)

第三种方法与前两种方法的唯一区别是内存管理。分配线程时,它会保留target,只有在线程被释放时才会被释放。 detatchNewThreadSelector:performSelectorInBackground:方法都会自动释放生成的NSThread,这意味着一旦线程完成执行,target将被释放。

在您提供的代码中(分配线程并启动它),您正在泄漏imgDlThread,这意味着永远不会释放target,反过来也会泄露。如果您在启动后自动发布或定期发布imgDlThread,则其效果与detachNewThreadSelector:完全相同。