block属于要是copy修饰的,给这个block属性赋值的时候,会对右边的block会进行一次copy操作,copy到堆上去,当然如果block属性用strong修饰,也会将右边的block copy到堆上去的,强引用block,block也是会copy到堆上的,不过我们一般建议用copy修饰,这样不管是MRC还是ARC这个写法都是一致的
其内存图如下
这种写法等价于下面的写法
_weak:不会产生强引用
_unsafe_unretained:不会产生强引用,不安全
如果是_weak修饰,当指向的对象销毁了,会自动把保存的地址值置为nil,而_unsafe_unretained修饰,指向的对象就算销毁了,也不会把保存的地址置为nil的。
//MRC是不支持_weak的
__weak typeof(self) weakSelf = self;
self.someBlock = ^{
__strong typeof(weakSelf) strongSelf = weakSelf;
[self doSomething];
}
在block外部使用weakSelf定义self的弱引用对象,然后在block内部对weakSelf进行一次强引用(防止执行到block块中代码的时候self被提前释放导致weakSelf为nil),由于strongSelf定义为局部变量,当其作用域结束后,strongSelf自动释放对self的强引用,从而避免了retain cycle。
person要是没有调用test方法,person是会正常释放的,要是person调用了test方法,不管有没有调用里面的block,person都不会正常释放,因为有循环引用
对应上图