ios高阶教程 块对象(block)的利用
2013-08-23 09:28
232 查看
在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.
}];
}
代码块初步应用也许你会发现,你可以偷懒了,不过对于模块化编程的程序不到万不得已不要用,但是如果是服用少的代码只管用,你会发现你的代码好看很多。
从本质上说,块对象本质上是一个匿名函数加上该函数的伴随数据。有些时候,其他语言也称块对象为 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.
}];
}
代码块初步应用也许你会发现,你可以偷懒了,不过对于模块化编程的程序不到万不得已不要用,但是如果是服用少的代码只管用,你会发现你的代码好看很多。
相关文章推荐
- ios高阶教程 块对象(block)的利用
- 学校学习ios教程笔记,第七节swift中的类与对象的属性和懒加载
- iOS 中的 block 是如何持有对象的
- ios 利用Block进行两个页面传值
- IOS block 教程
- iOS利用AVPlayer播放网络音乐的方法教程
- 利用Angular2 + Ionic3开发IOS应用实例教程
- IOS Block 教程
- iOS开发之OC与swift开发混编教程,代理的相互调用,block的实现。OC调用Swift中的代理, OC调用Swift中的Block 闭包,swift 3.0
- iOS开发-OC之知识树,知识点(包括对象、Block、消息转发、GCD、运行时、runloop、动画、Push、KVO、tableview,UIViewController、提交AppStore)
- 【iOS】利用block实现回调的示例
- iOS 演示 Modal Segue 的使用,包括参数如何从呈现者传递到 ModalView 以及数据如何从 ModalView 传回呈现者(利用委托对象)
- 【Objective-C高级编程】iOS与OS X多线程和内存管理(八) __block 从栈上复制到堆 截获对象 数组
- ios开发中使用copy类型的block时,防止循环利用的方法。
- iOS 中的 block 是如何持有对象的
- IOS block 教程
- iOS知识树,知识目录(包括对象、Block、消息转发、GCD、运行时、runloop、动画、Push、KVO、tableview,UIViewController、提交AppStore)
- iOS 利用NSNumber和NSValue将非OC对象类型数据存放到集合
- iOS--------block使用详细教程
- iOS 对象之间的通信方式(delegate、block、NSNotification、kvc、kvo)总结