在iOS 4.0引入了块对象。快对象是C级别的构造,您可以在C或Objective-C代码中使用快对象。
从本质上说,块对象本质上是一个匿名函数加上该函数的伴随数据。有些时候,其他语言也称块对象为 closure或者lambda。块对象非常适用于回调函数。如果您需要有很便捷的方法将执行代码和相关数据组合在一起,块对象也是很好的选择。
在 iOS系统中,块对象通常用于下述场合:
作为委托或委托方法的替代品。
作为回调函数的替代品。
用于实现一次性操作的完成处理器。
简化在群体所有子项上迭代执行某种任务的操作。
配合分发队列。可用于执行异步任务
为什么要使用block?
块对象封装一个单位(用术语来说就是代码段),这个代码段可以在任何时间执行。块对像有自己参数和返回值。你可以给你一个变量分配一个快对象,而这个块对象就像是你调用一个函数,快对象的返回值再传给变量;
插入符号符号(^)是作为一个块的语法标记。例如:下面的代码声明块变量,两个整数并返回一个整数值。它提供了参数列表后的第二个插入符号和括号内的实现代码,并分配这些乘以变量;
int (^Multiply)(int, int) = ^(int num1, int num2) {
return num1 * num2;
};
int result = Multiply(7, 4); // result is 28
快对象可以被认为是带有返回值类型的回调函数,在合适的时间,通过将代码块的参数传入代码块然后执行代码块返回值。为特定的应用程序代码提供额外的资源。
作为对象块的一个优点就是:他们回在开发者提供的调用点(回调发生的时机)自动调用对象块。这样对象块内的代码就不用在一个单独的代理函数内执行,这样让代码更易懂和简单。
我们以NSNotification各种通知为例。在“传统”的方法,一个对象增加了作为观察员通知,然后实现一个单独的方法(由在addObserver选择确定:..方法)处理通知:
按原来的系统的方法是这样写的:
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillShow:)
name:UIKeyboardWillShowNotification object:nil];
}
- (void)keyboardWillShow:(NSNotification *)notification {
// Notification-handling code goes here.
}
我们利用块对象后为这样:通过方法: addObserverForName:object:queue:usingBlock:我们可以利用代码为这样:
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserverForName:UIKeyboardWillShowNotification
object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notif) {
// Notification-handling code goes here.
}];
}
代码块初步应用也许你会发现,你可以偷懒了,不过对于模块化编程的程序不到万不得已不要用,但是如果是服用少的代码只管用,你会发现你的代码好看很多。