关于block:修饰符 用copy(要从堆区 拷贝到栈区)
前缀修饰符:
__block:默认情况下,block会把变量复制为自己私有的const变量,也就是说block会捕获栈上的变量,复制为自己的const变量,__block修饰符的作用就是,只要捕获到该变量被block持有,就将该变量在栈中的内存地址 放到堆中,此时 block内部还是外部,地址就一致,就可以随便改动了。
__weak :
(1)block 循环引用:
@property (nonatomic, copy) void (^block)(void);
当block 作为属性被强引用后,
- (void)configureBlock {
self.block = ^{
[self doSomething];
};
}
在block内部又对self进行了强引用(方法调用),在这种情况下,由于其相互引用,内存不能够被释放,造成内存泄漏,为了解决循环引用,我们经常就通过声明一个weakSelf来解决,加入weakSelf后,block对self的强引用就变成了弱引用,这样在属性所指的对象遭到摧毁时,属性值也被清空,打破循环引用,
网友评论