ios block(6)
来源:未知 责任编辑:责任编辑 发表时间:2015-09-17 09:44 点击:次
p> typedef void (^BlockType)(void);
p> BlockType blockObject = (BlockType)[obj objectAtIndex:0];
p> blockObject();
p>}
p>
p>
p>
p>
p>执行上面的代码中,在调用 testManageBlockMemory 时,程序会 crash 掉。因为从 getBlockArray 返回的 block 是分配在 stack 上的,但超出了定义 block 所在的作用域,block 就不在了。正确的做法(被屏蔽的那段代码)是在将 block 添加到 NSArray 中时先 copy 到 heap 上,这样就可以在之后的使用中正常访问。
p>
p>
p>在 ARC 下,对 block 变量进行 copy 始终是安全的,无论它是在栈上,还是全局数据段,还是已经拷贝到堆上。对栈上的 block 进行 copy 是将它拷贝到堆上;对全局数据段中的 block 进行 copy 不会有任何作用;对堆上的 block 进行 copy 只是增加它的引用记数。
p>
p>
p>如果栈上的 block 中引用了__block 类型的变量,在将该 block 拷贝到堆上时也会将 __block 变量拷贝到堆上如果该 __block 变量在堆上还没有对应的拷贝的话,否则就增加堆上对应的拷贝的引用记数。
p>
p>
相关新闻>>
最新推荐更多>>>
- 发表评论
-
- 最新评论 更多>>