码迷,mamicode.com
首页 > 移动开发 > 详细

iOS的block内存管理

时间:2015-09-03 17:50:29      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:

初始情况下:

block本身、__block修饰的变量以及在block内部使用的变量都是在栈里的。

__block修饰的变量的地址会作为实参传入block块内部(暂时先这么理解,实际比较复杂)。block使用的外部变量被const拷贝到了block内部。也就是block使用的外部变量和这个外部变量本身没有关系。

 

copy方法之后

被拷贝的方法还是在栈上。但是拷贝之后的block已经被放在了heap(堆)上。同时__block修饰的变量被移动到了堆上,原来在栈上的已经不存在。还有block的外部变量的const拷贝也被拷贝到了堆上。

堆上的block再做一次copy之后,只是引用计数增加1,但是不会重新再做拷贝动作。

 

retain操作

由于retain是有返回值的。retain要求返回的地址和调用对象的地址一致。但是block的地址可能是会变的(尤其是从栈到堆的过程),所以对block做retain操作是没有用处的。什么都不会做!

 

销毁(或内存回收时)

heap上的block块先于stack上的被销毁时,如调用release销毁堆上的block块。heap中的block块在引用计数变为0的时候被销毁。而__block修饰的变量还在heap中,因为stack还要使用,同时栈上的block快也要使用。

当heap上的block块晚于stack时,stack会被清除。在heap中的block块在调用release减少引用计数到0的时候释放内存。

 

iOS的block内存管理

标签:

原文地址:http://www.cnblogs.com/sunshine-anycall/p/4780356.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!