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被销毁
剩下的操作执行完就停止了
原文地址:http://www.cnblogs.com/xyzaijing/p/3876823.html