NSThreads,NSOperations和performSelector之间的区别

Raj*_*mar 6 iphone nsthread

我想问一些关于iPhone开发的简单而重要的问题.如果我们必须在后台执行任务并且后台任务完成后我们将更新UI,为此我们可以使用NSThreads,NSOperations或(performSelector)performSelectorInBackgroundThread.所有这些以及它们将如何影响我的应用程序性能之间的区别是什么.

还有一件事,这两个陈述之间的区别是什么: -

[self getData];

[self performSelector:@selector(getData)];

Please explain as i dont know the difference between all these things. 
Run Code Online (Sandbox Code Playgroud)

Max*_*Max 10

实际上没有太大的区别

[self getData];
Run Code Online (Sandbox Code Playgroud)

[self performSelector:@selector(getData)];
Run Code Online (Sandbox Code Playgroud)

唯一的区别是当您调用[self getData]时,编译器可以确定您要将getData消息发送到类的对象[self class].如果它找不到任何方法原型,那么早先宣布会有一个警告.

第一行和第二行将被翻译为

objc_msgsend(self, _cmd)
Run Code Online (Sandbox Code Playgroud)

performSelector: 当你想在运行时做某事时(例如你在运行时确定你想要发送给对象的确切消息)是非常酷的事情.或者这里是"现实生活"中的一个例子:UIButton有方法

- (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents
Run Code Online (Sandbox Code Playgroud)

因此它将动作存储在其内部的某个位置,当它调用适当的控制事件时:

[target performSelector: action];
Run Code Online (Sandbox Code Playgroud)

NSOperation只是用线程包装工作的好方法.而NSThread只是pthreads的包装.

因此,您的应用程序性能并不真正取决于您使用线程的方式,但使用NSOperation而不是pthreads更容易.


Kaz*_*oto 7

NSThread是pthreads(POSIX线程)的包装器.pthreads在Mach线程的顶部实现.您可以在使用NSThread时设置堆栈大小和优先级.(顺便说一句,根据我的经验,堆栈大小根本不会影响.)

NSOperation/NSOperationQueue是Grand Central Dispatch(libdispatch)又名GCD的包装器.GCD在pthreads之上实现.对于许多任务,这些比NSThread更容易使用.它减少了任务排队,线程池管理等的样板代码.

performSelectorInBackground:调用NSThread并处理终止的NSThread.在这些中只使用一个方法调用是最容易的.