objective-c block vs selector。哪一个更好?

时间:2011-09-26 22:48:06

标签: objective-c selector objective-c-blocks

例如,在实现一个要执行重复操作的方法时,在objective-c中,您需要在语言带给您的几个选项之间进行选择:

@interface FancyMutableCollection : NSObject { }
-(void)sortUsingSelector:(SEL)comparator;
// or ...
-(void)sortUsingComparator:(NSComparator)cmptr;
@end

我想知道哪一个更好

Objective-c提供了许多选项:选择器,块,函数指针,符合协议的类的实例等。

有时选择很明确,因为只有一种方法适合您的需求,但其余的方法呢?我不认为这只是时尚问题。

是否有任何规则可以知道何时使用选择器以及何时使用块?

2 个答案:

答案 0 :(得分:13)

我能想到的主要区别是,对于块,它们就像闭包一样,因此它们捕获了围绕它们的范围内的所有变量。当你已经拥有变量并且不想创建一个实例变量来暂时保存该变量以便操作选择器在运行时可以访问它时,这很有用。

与集合相关,如果系统中有多个核心,则块具有并发运行的附加功能。目前在iPhone中没有,但iPad 2确实拥有它,未来的iPhone型号可能会有多个核心。在这种情况下,使用块将允许您的应用程序在将来自动扩展。

在某些情况下,块也更容易读取,因为回调代码紧挨着调用它的代码。当然,情况并非总是这样,但有时它只会让代码更容易阅读。

很抱歉向您推荐文档,但要更全面地了解块的优缺点,请查看this page

正如Apple所说:

  

Blocks通常代表小的,自包含的代码片段。因此,它们特别有用,可以封装可以同时执行的工作单元,或者集合中的项目,或者当另一个操作完成时作为回调。

     

块是传统回调函数的有用替代方法,主要有两个原因:

     

它们允许您在稍后在方法实现的上下文中执行的调用点编写代码。   因此,块通常是框架方法的参数。

     

它们允许访问本地变量。   您可以直接访问本地变量,而不是使用需要数据结构的回调来体现执行操作所需的所有上下文信息。

this page

答案 1 :(得分:4)

那个更好的是那个在手头的情况下效果更好的人。如果您的对象都实现了支持所需顺序的比较选择器,请使用它。如果没有,一个块可能会更容易。