我想问一些关于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更容易.
NSThread是pthreads(POSIX线程)的包装器.pthreads在Mach线程的顶部实现.您可以在使用NSThread时设置堆栈大小和优先级.(顺便说一句,根据我的经验,堆栈大小根本不会影响.)
NSOperation/NSOperationQueue是Grand Central Dispatch(libdispatch)又名GCD的包装器.GCD在pthreads之上实现.对于许多任务,这些比NSThread更容易使用.它减少了任务排队,线程池管理等的样板代码.
performSelectorInBackground:调用NSThread并处理终止的NSThread.在这些中只使用一个方法调用是最容易的.
| 归档时间: |
|
| 查看次数: |
6587 次 |
| 最近记录: |