Multithreading +;[NSThread detachNewThreadSelector:toTarget:withObject:]和-[NSObject PerformSelector背景:withObject:]?

Multithreading +;[NSThread detachNewThreadSelector:toTarget:withObject:]和-[NSObject PerformSelector背景:withObject:]?,multithreading,cocoa,nsthread,Multithreading,Cocoa,Nsthread,它们似乎执行了一项相当类似的任务:启动一个新线程,快速轻松地执行该选择器。但是有什么区别吗?可能与内存管理有关?我认为它们是相同的,因为-(void)PerformSelector InBackground:(SEL)带对象的选择器:(id)arg在NSThread.h中的NSObject(NSThreadPerformAdditions)类别中定义。这不是结论,但这是这方面的证据。两者都是相同的 在iOS和Mac OS X v10.5及更高版本中,所有对象都能够生成一个新线程,并使用它来执行其

它们似乎执行了一项相当类似的任务:启动一个新线程,快速轻松地执行该选择器。但是有什么区别吗?可能与内存管理有关?

我认为它们是相同的,因为
-(void)PerformSelector InBackground:(SEL)带对象的选择器:(id)arg在NSThread.h中的
NSObject(NSThreadPerformAdditions)
类别中定义。这不是结论,但这是这方面的证据。

两者都是相同的

在iOS和Mac OS X v10.5及更高版本中,所有对象都能够生成一个新线程,并使用它来执行其方法之一。performSelectorInBackground:withObject:方法创建一个新的分离线程,并使用指定的方法作为新线程的入口点。例如,如果您有某个对象(由变量myObj表示),并且该对象有一个名为doSomething的方法,您希望在后台线程中运行该方法,则可以使用以下代码来执行此操作:

[myObj performSelectorInBackground:@selector(doSomething) withObject:nil];

调用此方法的效果与使用当前对象、选择器和参数对象作为参数调用NSThread的detachNewThreadSelector:toTarget:withObject:method相同。新线程使用默认配置立即生成并开始运行。在选择器中,必须像配置任何线程一样配置线程。例如,如果计划使用自动释放池,则需要设置自动释放池(如果未使用垃圾收集),并配置线程的运行循环。有关如何配置新线程的信息,请参见好问题。我想说的是,
perfomSelectorInBackground
可以重用池中的线程(通过
libdispatch
),但文档明确表示它将创建一个新线程。所以,是的,它似乎做了与
NSThread
方法完全相同的事情……我刚刚做了一个测试,没有人为您设置自动释放池。