由此可知外面访问的age,其实是_block age对应的结构体里面的age。
一旦block内部要访问对象了,用到某个对象了,block肯定要对它访问的对象进行内存管理。此时block底层结构的Desc会多两个函数,一个copy,一个dispose
int age的情况
int age的情况
下面是age加了_block修饰的情况
此时多了两个内存管理相关的函数,一个copy,一个dispose。
block最开始肯定是在栈上的,也就是栈block,但当block copy到堆上面去的时候,它会做另外一件事情,它会自动将我们block内部使用到的_block 变量的内存也拷贝到堆上,而且block内部对_block变量形成的是强引用。
当另一个block也访问这个_block的时候,当该block也copy到堆上的时候,此时_block不需要在copy到堆上,因为上一次该_block已经copy到堆上了,但该block对_block形成的也是强引用。
block强引用_block变量
block释放强引用的_block变量
block内部要直接使用的对象,既然是block要直接内部使用它,那block就要对它负责,对它内存进行管理,进行负责,所以由block来决定什么时候把它放到堆上面去,什么时候把它从堆中移除。
_weak只能修饰oc对象。
保证访问的肯定是复制到堆上的age中的age
block内部访问到的age就是堆上的!!!
_weak是用来修饰person对象的,不是用来修饰_block的,因为_block _weak int age = 10这么写是不好使的 当block拷贝到堆上的时候,block内部_block 变量生成的结构体也会拷贝到堆上,此时要是_block修饰的是oc类型的对象,当_block 变量生成的结构体拷贝到堆上的时候,会调用结构体里面的copy函数,
如果是MRC环境下,不管person,怎么写,结构体对person都是弱引用,这是比较蛋痛的一点,需要记住
MRC环境下,block还没释放,但是perosn已经挂了,也就是说,MRC环境下,_block修饰person,block里面不会对perosn引用计数加1,也就是不会产生强引用
MRC环境下,去掉_block修饰perosn,此时block还没有释放的时候,perosn也不会释放,说明block里面强引用了person,也就是block对perosn进行了引用计数加1
MRC环境下,block释放后,person也释放了
总结
网友评论