繁体   English   中英

Objective-C,NSThread分离与performSelectorInBackground

[英]Objective-C, NSThread detach vs. performSelectorInBackground

两者之间有什么区别?

 [NSThread detachNewThreadSelector:@selector(method) toTarget:self withObject:nil];
 [self performSelectorInBackground:@selector(method) withObject:nil];

我通常使用第二种方法来产生新线程。 但是我想知道如果我像下面所示的方法两次调用它,那将会发生什么? 另外,如果我有一个菜单菜单,并且每个菜单都产生一个线程,那么我应该使用哪个线程?

 [self performSelectorInBackground:@selector(method1) withObject:nil];
 [self performSelectorInBackground:@selector(method2) withObject:nil];

它们是相同的。 这是官方文档中关于该主题的内容:

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

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

调用此方法的效果与使用当前对象,选择器和参数对象作为参数调用NSThread的detachNewThreadSelector:toTarget:withObject:方法的效果相同。 立即使用默认配置生成新线程并开始运行。 在选择器内部,必须像配置任何线程一样配置线程。 例如,如果您打算使用自动释放池(如果您不使用垃圾回收),则需要设置它,并配置线程的运行循环。 有关如何配置新线程的信息,请参阅“配置线程属性”。

至于如果您这样做:

[self performSelectorInBackground:@selector(method1) withObject:nil];
[self performSelectorInBackground:@selector(method2) withObject:nil];

...您将产生两个新线程,其中一个线程在method1开始执行,其中一个线程在method2开始执行。 线程可以同时执行(即第二个线程在开始执行之前不会等待第一个线程终止)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM