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会销毁掉
网友评论