detachNewThreadSelector
与performSelectorInBackground
有什么不同?在我的项目中,我使用了很多:
[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];
谢谢!
修改
刚刚意识到在performSelectorInBackground
和detachNewThreadSelector
之间已经有几个关于SO的答案已经存在差异(或缺少),所以我想我唯一的问题是:
正在分配和初始化NSThread
,然后调用[thread start]
与前2个不同的任何不同?
答案 0 :(得分:1)
第三种方法与前两种方法的唯一区别是内存管理。分配线程时,它会保留target
,只有在线程被释放时才会被释放。 detatchNewThreadSelector:
和performSelectorInBackground:
方法都会自动释放生成的NSThread
,这意味着一旦线程完成执行,target
将被释放。
在您提供的代码中(分配线程并启动它),您正在泄漏imgDlThread
,这意味着永远不会释放target
,反过来也会泄露。如果您在启动后自动发布或定期发布imgDlThread
,则其效果与detachNewThreadSelector:
完全相同。