performSelectorInBackground和NSOperation Subclass之间的区别

时间:2010-05-29 12:25:39

标签: objective-c cocoa multithreading nsoperation

我已经创建了一个用于运行深度计数器循环的测试应用。我使用performSelectorInBackground和NSOperation子类分别在后台线程中运行循环函数。

我还使用performSelectorOnMainThread来通知backthread方法中的主线程和NSOperation子类中的[NSNotificationCenter defaultCenter] postNotificationName,以通知主线程更新UI。

最初两个实现都给了我相同的结果,我能够更新UI而不会有任何问题。我找到的唯一区别是两个实现之间的线程数。

performSelectorInBackground实现创建了一个线程,并在循环结束后终止,我的应用程序线程计数再次变为1.

NSOperation子类实现创建了两个新线程并保留在应用程序中,我可以在main()函数中完成循环后看到3个线程。

所以,我的问题是为什么NSOperation创建了两个线程,为什么它没有像第一个后台线程实现那样被终止?

我有点混淆,无法确定哪种实现在性能和内存管理方面最佳。

1 个答案:

答案 0 :(得分:6)

操作队列可能会保持线程处于活动状态,等待新操作出现。

您必须记住,操作队列旨在与许多操作一起高效工作,因此为每个操作创建和销毁线程会损害性能。所以你所看到的可能就是通过保持线程池活着来设计队列的方式。

基本上,只要您正确使用操作队列并根据文档我就不用担心了。