前言
筆記:思維設(shè)計圖,方法調(diào)用棧暫時先擱置,先補(bǔ)補(bǔ)校招知識
參考資料
設(shè)計思路






技術(shù)點(diǎn)
- Category Use Method Swizzling
- Category AssociatedObject
- systemLayoutSizeFittingSize And sizeThatFits
Category Use Method Swizzling
1.類中調(diào)用+load方法和-category中調(diào)用和+load方法調(diào)用順序是怎樣(類和分類同時重寫load方法)?
答:+load的執(zhí)行順序是先類,后category,而category的+load執(zhí)行順序是根據(jù)編譯順序決定的。
**2.類和-category中調(diào)用和+load方法調(diào)用順序是怎樣(只有分類重寫load方法)? **
答:先調(diào)用category +load方法,后類
- 在Objective-C實(shí)現(xiàn)擴(kuò)展方法可以使用Category來覆蓋系統(tǒng)方法,當(dāng)系統(tǒng)方法被覆蓋后,系統(tǒng)會優(yōu)先調(diào)用Category中的代碼,然后在調(diào)用原類中的代碼,如果我們在已有的Category想實(shí)現(xiàn)UIWebViewDelegate代理方法,往往就會使用Method Swizzling,可以通過新建UIWebView Category,在其分類使用+(load)Method Swizzling替換代理方法為自己構(gòu)造的方法(構(gòu)造的方法內(nèi)部計算UIWebView 高度并緩存高度),再執(zhí)行項(xiàng)目當(dāng)中UIWebViewDelegate代理方法
Category AssociatedObject
1.在category里面如何添加實(shí)例變量的?
答:在category里面是無法為category添加實(shí)例變量的。但是我們很多時候需要在category中添加和對象關(guān)聯(lián)的值,這個時候可以求助關(guān)聯(lián)對象來實(shí)現(xiàn)。
2.但是關(guān)聯(lián)對象又是存在什么地方呢? 如何存儲? 對象銷毀時候如何處理關(guān)聯(lián)對象呢?
關(guān)聯(lián)對象又是存在什么地方:AssociationsManager里面是由一個靜態(tài)AssociationsHashMap來存儲所有的關(guān)聯(lián)對象的。
如何存儲:所有對象的關(guān)聯(lián)對象都存在一個全局map里面。而map的的key是這個對象的指針地址(任意兩個不同對象的指針地址一定是不同的),而這個map的value又是另外一個AssociationsHashMap,里面保存了關(guān)聯(lián)對象的kv對。
對象銷毀時候如何處理關(guān)聯(lián)對象:runtime的銷毀對象函數(shù)objc_destructInstance里面會判斷這個對象有沒有關(guān)聯(lián)對象,如果有,會調(diào)用_object_remove_assocations做關(guān)聯(lián)對象的清理工作。
systemLayoutSizeFittingSize And sizeThatFits
LT_systemFittingHeightForConfiguratedWebView:該方法提供了兩套計算高度方式,分別是框架布局和自動布局
當(dāng)enforceFrameLayout為NO時使用自動布局自動布局的步驟:
(1)在計算高度前向 contentView 加了一條和 webView 寬度相同的寬度約束,強(qiáng)行讓 contentView 內(nèi)部的控件知道了自己父 view 的寬度,再反算自己被外界約束的寬度(給contentView添加約束)
(2)調(diào)用systemLayoutSizeFittingSize api為contentView自適應(yīng)高度
(3)移出contentView約束框架布局