黑马程序员技术交流社区
标题:
oc中的block
[打印本页]
作者:
allen0206
时间:
2014-10-18 12:23
标题:
oc中的block
一,
1,block的声明格式:
返回值类型(^block的名字)(参数类型1,参数类型2,.......)
2,block的定义格式
^返回值类型(参数类型1 参数名,参数类型2 参数名.......){return 返回值类型;}
3,一般来说,在block内只能读取在同一个作用域的变数而且没有办法修改在block外定义的任何变数,此时若我们想要这些变数能够在block中被修改,就必须在前面挂上__block的修饰词
二,blocks的应用
1,用作多线程的代码单元(GCD),多核并行编程。
2,用作某个函数调用完成后的回调函数。如UIView动画,Notification。
Block作为回调函数比传统回调函数的优越性:
在函数调用的时候,将block作为一个参数传递,使得代码紧凑,结构清晰。
例如:
block之前,
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillShow:)
name:UIKeyboardWillShowNotification object:nil];
}
- (void)keyboardWillShow:(NSNotification *)notification {
// Notification-handling code goes here.
}
block之后,
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserverForName:UIKeyboardWillShowNotification
object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notif) {
// Notification-handling code goes here.
}];
}
3,允许访问本地变量,这样可以避免通过结构体将本地变量封装后传递给回调函数。最为典型的就是异步数据下载后,更新ui。
NSString* parameter = [self getSomeParameter];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{NSString* result
= [self fetchResultFromWebWithParameter:parameter];
dispatch_async(dispatch_get_main_queue(), ^{[self updateUIWithResult:result]; // 能直接使用上层block中的变量result,只读的。所以说可以直接使用局部变量});
});
五,Blocks的内存管理
上面提到,block是分配在栈上的,它也可以跟其他的对象一样retain,release;有时,我们需要延长block的生命周期,可以使用Block_copy(block)将block变量拷贝到heap上
[block1 copy] 后,原先分配在stack上的__block 变量 shared 别移动了heap上;
对于copy到heap中的block 再copy时,行为同普通对象retain一样,会使引用计数+1
20130830170027375.png
(96.89 KB, 下载次数: 0)
下载附件
2014-10-18 12:23 上传
作者:
弹琴骚年
时间:
2014-10-18 21:18
内容挺好的。。就是字的颜色。。亮瞎了我。:)
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2