看完 `Masonry` 原始碼後的幾點思考?

Swants發表於2019-03-04

最近花了兩週的時間讀了 Masonry 原始碼,被它優雅的語法深深打動。它把 Apple 原生 AutoLayout 冗長,繁瑣的約束語法真是封裝得簡潔優雅到了極致。每一次看,都能看到不一樣的東西,在這裡也強烈推薦各位小夥伴閱讀它的原始碼。我把我在看原始碼期間想到的問題,收穫,總結到了下面幾個問題中,您看能答出來多少呢?歡迎在下方評論。

  1. Masonry 都做了些什麼?
[self.view addSubview:btn];
[btn makeConstrants:^(MASLayoutConstraint *make){
make.left.equalTo(self.view).offset(12);
}];
複製程式碼

上述程式碼會發生迴圈引用嗎,為什麼?

  1. MAS_SHORTHANDMAS_SHORTHAND_GLOBALS 巨集是做什麼用的?它的效果是怎麼實現的呢?

  2. MasonrymakeConstraints:updateConstraints:remakeConstraints: 有什麼區別,分別適合那些場景?

  3. 描述下程式碼 make.left.right.top.equalTo(self.view).offset(0); 都做了些什麼?

  4. Masonry 是如何做到鏈式優雅呼叫的?

下面幾個問題可能比較細節,希望不要介意。

  1. MASViewConstraint 為什麼要弱引用一個 MASLayoutConstraint 的例項物件,它又用這個物件做了什麼?

  2. MASConstraintMaker 持有一個 constraints 陣列, 而 MASViewConstrint 類也有一個用來記錄約束的陣列,這兩個陣列都是用來記錄生成的約束,那麼這兩個陣列有什麼區別嗎?各自的作用又是什麼?

- (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 做什麼?

  1. MASConstraintMaker 都在什麼時候會初始化 MASViewAttribute物件?

儘管筆者水平有限,但對這些問題的拙劣見解還是會在下篇文章中放出,在這希望可以拋磚引玉,期待各位大牛共同探討 Masonry 優雅的精髓。

相關文章