码迷,mamicode.com
首页 > 其他好文 > 详细

block内存管理

时间:2014-07-30 03:16:03      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:使用   io   ar   管理   对象   存储   指针   内存   

block默认是存储在栈内存中的,需要做一些操作才能到堆中

MRC情况下-------------------

这种情况下block创建以后需要做block_copy()操作才能复制到堆中,如果block在栈中,是不会对block内使用的对象做操作的

但是如果你的block已经拷贝到了堆中,你就要注意了,因为此时block会对块内的对象做retain操作,所以如果block已经在堆中,并且块要访问对象的话,

需要使用__block 修饰符声明变量,来组织block对块内的对象做retain操作

::对对象的访问包括调用对象的方法或访问对象的属性变量等,如果block在类的内部,block块内直接访问_xxx等变量,看似没有self等,但其实也访问了该对象,其实是通过self->XXX访问的

 

所以此时必须要加__block修饰

——————————————

 

如果是ARC环境

应该使用__weak 或者__unretained_unsafe修饰block

 

 

此外如果是operation中的block访问对象,且这个operation不是添加到主队列里面的

这时候访问self或者对象不需要加前置修饰符,因为只有主线程有运行循环引用着它,

其他的线程都是干完活以后直接被销毁,所以其内部相关变量也就不存在了(block

并且如果是self-》operationQueue-》operation-》一些block,此时必须不能用修饰符去修饰

因为如果用了修饰符,就有可能self缺少强引用而被销毁,为什么会缺少强引用呢?

不是有强指针指着呢吗?因为强指针有时候会在主线程里,而你添加的block操作添加到了其他线程里

出了那个强引用的作用域,但是其他线程里面block操作还没做完,此时已经没有了强引用,self被销毁

剩下的操作执行完就停止了

block内存管理,布布扣,bubuko.com

block内存管理

标签:使用   io   ar   管理   对象   存储   指针   内存   

原文地址:http://www.cnblogs.com/xyzaijing/p/3876823.html

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