為什么黑魔法獨愛+load ?

+load 方法是類級方法,對比alloc等對象級方法,在 rumtime 中是個特殊的存在:

特點1:+load 由 rumtime 自動調(diào)用

initialize不同,無論實現(xiàn)的類本身是否被使用,+load 一定會被調(diào)用。

特點2:+load 在main之前調(diào)用

具體是在dylb加載完二進(jìn)制文件之后,類被加載到runtime中時。因此,+load 比init方法更早執(zhí)行,還是個比main還要早執(zhí)行的存在。

特點3:+load 能夠保證只執(zhí)行一次

對比initialize,如果子類調(diào)用了[super initialize];,其父類的initialize方法會被調(diào)用多次,這就需要用特殊方法來進(jìn)行唯一性保護(hù),+load 則沒有這些煩惱,即使調(diào)用[super load]。

即使調(diào)用[super load]不會影響load的唯一性,卻會導(dǎo)致initialize的執(zhí)行“混亂”,因此你不應(yīng)該調(diào)用[super load]。

有些文章建議可以手動調(diào)用+load 方法,這里依然是不建議,鑒于+load的特殊性,手動調(diào)用破壞了唯一性

凡是系統(tǒng)自動調(diào)用的,都不要手動干預(yù)。

特點4:可以在類別中定義 +load

定義在類別中的 +load 不會覆蓋類自己的 load 方法,并且總是按固定順序調(diào)用(見特點5),因此,使用類別調(diào)用 load 是安全的。

特點5:調(diào)用順序是固定的

  • 類的+load方法在其所有父類的+load之后調(diào)用。
  • 在類自己的+load方法之后調(diào)用類別 +load方法。

根據(jù)我的實驗觀察順序如下:
父類 > 類 > 類的類別 > 父類的類別

黑魔法的選擇

眾多iOSer稱Method Swizzling為黑魔法,實際上就是利用runtime的動態(tài)特性在向一個對象發(fā)送消息時“劫胡”,替換自己想要的方法,需要滿足必須調(diào)用一次,且只能調(diào)用一次的要求,如果有多個Swizzing,調(diào)用順序也必須是確定的,這些要求load都能滿足。
當(dāng)然,了解了+load方法的以上特點,不應(yīng)該用+load做以下用途(包含但不限于):

  • load 方法中使用其他類。
  • 不要執(zhí)行長時間操作,會導(dǎo)致APP超時啟動退出。
  • 初始化對象數(shù)據(jù),可以這么理解,load執(zhí)行時,所在類只是被“注冊”,并沒有分配內(nèi)存。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在這之前,我從沒有想過,+load和+initialize能扯出這么多東西來,但今天確實扯出這么多,如有錯誤之處,...
    xiaogangsi閱讀 5,896評論 8 44
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 2,030評論 0 9
  • iOS開發(fā)中總能看到+load和+initialize的身影,網(wǎng)上對于這兩個方法有很多解釋,官方也有說明,但有些細(xì)...
    朱曉輝閱讀 27,675評論 19 139
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,621評論 1 32
  • Objective C類方法load和initialize的區(qū)別過去兩個星期里,為了完成一個工作,接觸到了NSOb...
    亦晴工作室閱讀 1,434評論 0 10

友情鏈接更多精彩內(nèi)容