iOS为什么Block的属性声明要用copy
来源:互联网 发布:沈阳网络电玩城 编辑:程序博客网 时间:2024/05/17 01:00
在实际开发中,发现使用Block有着比delegate和notification更简洁的优势。于是在目前的项目中大量的使用block。
在我的头文件我是这样声明使用block的。
- @interface BrushViewController : BaseViewController
- @property (nonatomic, copy) void (^getCardInfo)(NSDictionary *cardInfo);
- @end
我将block声明为copy的原因是在代码块里面我可能会使用一些本地变量。而block一开始是放在栈上的,只有copy后才会放到堆上。
如果加copy属性,当其所在栈被释放的时候,这些本地变量将变得不可访问。一旦代码执行到block这段就会导致bad access。
- brush.getCardInfo=^(NSDictionary *info){
- [self test];
- };
但是这又带来另一个问题,就是self的引用计数+1。这意味着很可能会导致循环引用。self持有brush,brush持有block,block持有self。结果就是内存泄漏。
解决的办法如下:
- __block CurrentViewController* blockSelf = self;
- brush.getCardInfo=^(NSDictionary *info){
- [blockSelf test];
- };
通过这个方式,告诉block这个变量的引用计数不要+1。
如果你使用的是ARC,那么就应该改成下面这样:
- __weak CurrentViewController* blockSelf = self;
- brush.getCardInfo=^(NSDictionary *info){
- [blockSelf test];
0 0
- iOS为什么Block的属性声明要用copy
- iOS为什么Block的属性声明要用copy
- iOS为什么Block的属性声明要用copy
- ios中为什么block用copy属性
- ios-block作为属性的时候为什么用copy
- Block 为什么要用copy属性
- iOS block为什么要用copy
- ios 基础Block为什么用copy修饰
- iOS block为什么用copy修饰?
- iOS之Block为什么用copy修饰
- block为什么用copy
- 设置block成员属性时为什么用copy
- block为什么要用Copy修饰
- Block 为什么要用 Copy 修饰
- iOS中为什么block用copy来修饰
- block为什么用copy关键字
- Block为什么用copy修饰
- 代码块(block)的使用---iOS4.0以后推出(声明成属性的时候,用copy修饰)
- VB编程概述
- 大数开根号(蓝桥杯-矩阵翻硬币)
- 【Spark】Spark容错机制
- 静态 static
- C8_指针
- iOS为什么Block的属性声明要用copy
- Class文件结构
- 架构师速成6.5-也谈设计模式
- 【Spark】Spark的Shuffle机制
- 【SeekBar】Android 自定义漂亮的SeekBar样式
- 大楼扔鸡蛋问题(动态规划)
- 华为OJ--统计输入一串字符中数字,字母,空格及其他字符的个数
- C8_指针练习
- 【Spark】SparkContext源码解读