为啥iOS的Masonry中的self不会循环引用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥iOS的Masonry中的self不会循环引用相关的知识,希望对你有一定的参考价值。

公式引用的对象,直接或间接地引用了当前单元格本身。所以给出错误提醒。解决办法:一,通过错误检查,找到循环引用的部分,改过来;二、某些情况下,如果确实需要一定程度的循环引用,那就在工具-选项-计算里勾选和填写迭代次数 参考技术A - (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *))block
self.translatesAutoresizingMaskIntoConstraints = NO;
MASConstraintMaker *constraintMaker = [[MASConstraintMaker alloc] initWithView:self];
block(constraintMaker);
return [constraintMaker install];

masonry某个方法的内部实现,可见调用者并不持有这个block,所以不会产生循环引用

ios入门Masonry约束立即生效跟约束更新

Masonry约束立即生效跟约束更新
原创忝 最后发布于2016-11-14 16:42:07 阅读数 20941 收藏
展开
在使用Masonry的时候,默认情况下,设置的约束并不会立即生效,此时获得的所有的frame都为0。但在有的时候,我们需要获取此时的宽跟高,此时就要设置控件的约束立即生效。

view1 = [UIView new];
[self.view addSubview:view1];
[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self.view).insets(UIEdgeInsetsMake(10, 10, 10, 10));
}];
view1.backgroundColor = [UIColor redColor];
NSLog(@"%@",view1.description);

得到的结果显示frame为0:

<UIView: 0x7f9d20d0b650; frame = (0 0; 0 0); layer = <CALayer: 0x608000227900>>
1
所以需要在mas_makeConstraints之后用它的父视图调用layoutIfNeeded可以使得约束立即生效:

view1 = [UIView new];
[self.view addSubview:view1];
[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self.view).insets(UIEdgeInsetsMake(10, 10, 10, 10));
}];
view1.backgroundColor = [UIColor redColor];
[self.view layoutIfNeeded];
NSLog(@"%@",view1.description);

得到的结果显示:

<UIView: 0x7fa8d8d05730; frame = (10 10; 394 716); layer = <CALayer: 0x60800003ca20>>
1
提示:layoutIfNeeded在自身也可以生效,不过可能会导致坐标不准确等后果,而用在父视图上不会发生问题。

关于约束更新:
约束更新内容简要写一些,不写详细代码了。

约束更新的内容需要写入mas_updateConstraints中,如果需要立即更新的话需要两个步骤1、updateConstraintsIfNeeded 2、layoutIfNeeded

如果需要产生动画效果的话,将layoutIfNeeded这个方法在[UIView animateWithDuration]中调用即可。

两个方法都是在父视图中使用的。
————————————————
版权声明:本文为CSDN博主「忝」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u011415099/article/details/53160595

以上是关于为啥iOS的Masonry中的self不会循环引用的主要内容,如果未能解决你的问题,请参考以下文章

ios -- Masonry 更新约束

Masonry记录——iOS适配

block中self会造成循环引用问题

为啥自引用 iframe 不会无限循环并导致我的机器崩溃?

iOS Block循环引用精讲

iOS中block的使用详解