![](/img/trans.png)
[英]Objective-C NSThread ref counting convention (retain vs autorelease)
[英]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表示),并且该对象具有要在后台线程中运行的名为doSomething的方法,则可以使用以下代码来执行此操作:
[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.