block 调用self 有可能会导致循环引用,但是是否会引起循环引用你只要看函数内部是否copy了这个block就知道了.
创建的block在栈中使用完就释放了,生命周期不超出作用域,copy了就将block复制到堆中
查看Masonry mas_makeConstraints方法
- (NSArray *)mas_makeConstraints:(void(NS_NOESCAPE ^)(MASConstraintMaker *make))block;
- (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *))block {
self.translatesAutoresizingMaskIntoConstraints = NO;
MASConstraintMaker *constraintMaker = [[MASConstraintMaker alloc] initWithView:self];
block(constraintMaker);
return [constraintMaker install];
}
没有copy 使用完就释放了 是不会造成循环引用的.
在swift里有一个很好的雅称,中文翻译版叫非逃逸闭包。这个闭包只能在当前作用域里执行,不能超出。即无法将这个闭包异步调用或等待时机调用。这种闭包用完就被释放了,所以不会有引用循环之类的问题。
内部引用变量 self,进入block的是self.view,block调用了self,但self并没有调用block,所以不会循环引用
网友评论