例如,在objective-c中,当你要实现一个将要执行重复操作的方法时,你需要在语言提供的几个选项中做出选择:
@interface FancyMutableCollection : NSObject { }
-(void)sortUsingSelector:(SEL)comparator;
// or ...
-(void)sortUsingComparator:(NSComparator)cmptr;
@end
我想知道哪一个是更好?
Objective-c提供了许多选项:选择器、块、指向函数的指针、符合协议的类的实例,等等。
有时候选择是明确的,因为只有一种方法适合你的需要,但其他的呢?我不希望这只是一个时尚问题。
有什么规则知道什么时候使用选择器,什么时候使用块?
我能想到的主要区别是,对于块,它们就像闭包一样,因此它们捕获了它们周围作用域中的所有变量。当你已经有了变量,并且不想创建一个实例变量只是为了暂时保存该变量,以便操作选择器在运行时可以访问它时,这是很好的。
对于集合,如果系统中有多个内核,块具有并发运行的能力。目前iPhone还没有,但ipad2有,未来的iPhone很可能会有多核。在这种情况下,使用块可以让你的应用在未来自动扩展。
在某些情况下,块也更容易阅读,因为回调代码就在调用它的代码旁边。当然,情况并非总是如此,但有时它确实使代码更易于阅读。
很抱歉让您参考文档,但要更全面地了解块的优缺点,请查看此页面。
正如苹果公司所说:
块代表典型的小的、自包含的代码片段。因此,它们在封装工作单元时特别有用,这些工作单元可以并发执行,或者在集合中的项上执行,或者在另一个操作完成时作为回调。
块是传统回调函数的有用替代品,主要有两个原因:
它们允许您在调用点编写稍后在方法实现上下文中执行的代码。因此,块通常是框架方法的参数。
允许访问局部变量。比起使用需要包含执行操作所需的所有上下文信息的数据结构的回调,您只需直接访问局部变量。
本页
在当前情况下效果更好的那个才是更好的。如果您的所有对象都实现了支持所需排序的比较选择器,请使用它。如果不是,块可能会更容易。