您的位置:首页 > 编程语言

block代码块对变量的处理的一些看法

2014-11-04 10:53 232 查看
1,先给大家推荐一篇博文,关于arc下使用代码块避免循环的,对我的帮助比较大,原文地址:http://www.cnbluebox.com/?p=255%3C/p%3E

2,我总结一下我对于使用代码块时block对相应变量的一些处理:(有可能出现错误,希望大家指正)

在非arc环境下,先来看普通变量的变化,如下代码:

UILabel * __block label = [[UILabel alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 100.0f, 20.0f)];
NSLog(@"label_RetainCount:%d",[label retainCount]);
self.block =  [^(void){
label.frame = CGRectMake(0.0f, 0.0f, 0.0f, 0.0f);
NSLog(@"label_RetainCount:%d",[label retainCount]);
} copy];
self.block();
第一次输出的引用计数是1,第二次输出的是2(代码块中的),说明代码块将变量进行的retain操作,然后将普通变量加上__block 修饰符

UILabel * __block label = [[UILabel alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 100.0f, 20.0f)];
NSLog(@"label_RetainCount:%d",[label retainCount]);
self.block =  [^(void){
label.frame = CGRectMake(0.0f, 0.0f, 0.0f, 0.0f);
NSLog(@"label_RetainCount:%d",[label retainCount]);
} copy];
self.block();
两次输出的都是1,说明了代码块对于label没有进行任何处理,就单单传递了它的指针给代码块

在arc环境下,对于普通变量(__strong修饰符),block会对它进行强引用,所以容易产生block循环。解决的方法是使用__weak修饰符,假如除了不进行强引用还需要修改变量值的话可以增加一个__block修饰符,比如__block id __weak obj;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: