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

hec*_*ctr 5 objective-c selector objective-c-blocks

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

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

我想知道哪一个更好

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

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

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

Jor*_*eña 13

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

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

在某些情况下,块也更容易读取,因为回调代码紧挨着调用它的代码.当然,情况并非总是如此,但有时它确实使代码更容易阅读.

很抱歉为您推荐文档,但要更全面地了解块的优缺点,请查看此页面.

正如Apple所说:

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

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

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

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

这个页面上

  • 使用选择器不称为"目标 - 动作模式".这仅限于UI元素与任何对象(目标)和方法(动作)之间的关系应该处理用户激活UI元素(按下按钮). (4认同)