看完 `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 優雅的精髓。

相關文章
相關標籤/搜索