看完 `Masonry` 源码后的几点思考?

最近花了两周的时间读了 Masonry 源码,被它优雅的语法深深打动。它把 Apple 原生 AutoLayout 冗长,繁琐的约束语法真是封装得简洁优雅到了极致。每一次看,都能看到不同的东西,在这里也强烈推荐各位小伙伴阅读它的源码。我把我在看源码期间想到的问题,收获,总结到了下面几个问题中,您看能答出来多少呢?欢迎在下方评论。数组

  1. Masonry 都作了些什么?
[self.view addSubview:btn];
[btn makeConstrants:^(MASLayoutConstraint *make){
make.left.equalTo(self.view).offset(12);
}];
复制代码

上述代码会发生循环引用吗,为何?bash

  1. MAS_SHORTHANDMAS_SHORTHAND_GLOBALS 宏是作什么用的?它的效果是怎么实现的呢?ui

  2. MasonrymakeConstraints:updateConstraints:remakeConstraints: 有什么区别,分别适合那些场景?spa

  3. 描述下代码 make.left.right.top.equalTo(self.view).offset(0); 都作了些什么?code

  4. Masonry 是如何作到链式优雅调用的?对象

下面几个问题可能比较细节,但愿不要介意。rem

  1. MASViewConstraint 为何要弱引用一个 MASLayoutConstraint 的实例对象,它又用这个对象作了什么?源码

  2. MASConstraintMaker 持有一个 constraints 数组, 而 MASViewConstrint 类也有一个用来记录约束的数组,这两个数组都是用来记录生成的约束,那么这两个数组有什么区别吗?各自的做用又是什么?it

- (NSArray *)mas_updateConstraints:(void(^)(MASConstraintMaker *))block {
    self.translatesAutoresizingMaskIntoConstraints = NO;
    MASConstraintMaker *constraintMaker = [[MASConstraintMaker alloc] initWithView:self];
    constraintMaker.updateExisting = YES;
    block(constraintMaker);
    return [constraintMaker install];
}
复制代码

上述源码中,MASConstraintMaker 的初始化方法 initWithView:MASConstraintMaker初始化了一个 view 属性 ,MASConstraintMaker 持有这个 view 作什么?class

  1. MASConstraintMaker 都在何时会初始化 MASViewAttribute对象?

尽管笔者水平有限,但对这些问题的拙劣看法仍是会在下篇文章中放出,在这但愿能够抛砖引玉,期待各位大牛共同探讨 Masonry 优雅的精髓。

相关文章
相关标签/搜索