block代码块对变量的处理的一些看法
2014-11-04 10:53
232 查看
1,先给大家推荐一篇博文,关于arc下使用代码块避免循环的,对我的帮助比较大,原文地址:http://www.cnbluebox.com/?p=255%3C/p%3E
2,我总结一下我对于使用代码块时block对相应变量的一些处理:(有可能出现错误,希望大家指正)
在非arc环境下,先来看普通变量的变化,如下代码:
在arc环境下,对于普通变量(__strong修饰符),block会对它进行强引用,所以容易产生block循环。解决的方法是使用__weak修饰符,假如除了不进行强引用还需要修改变量值的话可以增加一个__block修饰符,比如__block id __weak obj;
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;
相关文章推荐
- 处理block中调用对象实例变量导致的循环引用
- Block引用全局变量处理(内存泄露问题)
- 关于异常处理的一些看法
- PHP的关于变量和日期处理的一些面试题目整理
- PHP的关于变量和日期处理的一些面试题目整理
- 关于block访问外部变量的一些小注意点
- 关于全局变量,局部变量的一些看法!!!
- 一些java处理变量的 让我眼前一亮的
- block 对外部引用变量的处理
- block 对外部引用变量的处理
- iOS:使用block代码块实现事件处理过程中的回调
- __block修饰变量以及代码块的用法
- R语言变量的重命名和一些处理
- 我对变量的一些看法。
- 对 block 内存管理的一些看法
- 关于图像处理的一些不成熟的看法
- 其他文本处理命令以及bash变量中的一些字符串的处理方法
- block 对外部引用变量的处理
- [收集]一些关于数据压缩和图像处理的网站
- Natty Gur的BLOG中关于体系结构的一些看法