OC三方框架05:Masonry探索
Masonry 的 block 中调用 self 会造成循环引用么?
下面我们通过实例分析一下:
1 | UIButton * btn = [[UIButton alloc] init]; |
- 控制器
self
会强引用自己的子类view
,即self -> view
btn
实例被添加到view
上,即view -> btn
- 因为
btn
调用了masonry
的mas_makeConstaints
方法,其中参数block
引用了self
。
那么问题来了,这里的 block
对 self
是强引用么?
我们要想知道答案,需进入 mas_makeConstraints
方法中看看它的实现方式才行:
1 | - (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *))block { |
由源码实现可以知道,block
持有的是 局部临时变量
,也就是说当 block
超出作用域就会被销毁。此时的循环链是:self -> view -> btn -> block -> x -> self
,没有构成相互持有
- 类似于
OC
基础动画Api
的block中使用self访问成员变量:均不会造成循环引用
1 | [UIView animateWithDuration:2 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{ |
- Post title:OC三方框架05:Masonry探索
- Post author:张建
- Create time:2023-05-30 14:00:18
- Post link:https://redefine.ohevan.com/2023/05/30/OC三方框架/OC三方框架05:Masonry探索/
- Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.