block内存管理和循环引用

2017-12-08  本文已影响29人  有理想有暴富的小青年

block内存管理

MRC: 在mrc中没有strong和weak;用copy修饰block;因为block刚刚声明出来的时候(没有引用外部的任何变量的时候是放在全局区global的),引用外部局部变量(包括_ _block修饰的局部变量)后放在栈区,引用外部全局变量或是静态变量后放在全局区;

局部变量的对象(block生命在局部的话,就是局部变量对象)都是基本数据类型,都放在栈区,代码块过后便会销毁

需要用copy 修饰block 是将block放到堆区

ARC:用strong和copy一样;刚刚声明出来(没有引用任何变量)也是放在全局区,引用了外部的局部变量后放在堆区,引用外部全局变量或是静态变量后放在全局区;

局部变量对象默认有一个强指针引用着 ,放在堆区


block值传递和指针传递

ARC中block引用了局部变量后,block内部是值传递,值已经传递到了block内部,block外部修改值,block内部的值是不会变化的,再次调用也不会变化的

当使用_ _block修饰、static变量,全局变量时候 是指针传递,修改的是内存里面的值,是会改变的


block循环引用和提前释放

block内部需要使用_ _weak typeof(self) weakself = self;

如果里面有延时操作的话需要用_ _strong typeof(self) weakself = self;

因为block会对内部所有强指针变量进行强引用一次,延时的话weakself会销毁掉

上一篇下一篇

猜你喜欢

热点阅读