今天我們來談一下IOS中老生常談的load方法和initialize方法,首先來說一下為什么總會把這兩個方法做比較。這就要從IOS的優(yōu)化說起,IOS的優(yōu)化又要從IOS的啟動說起也就是我們常說的冷啟動優(yōu)化,冷啟動優(yōu)化大概有兩個階段 已main函數(shù)為界限分為main函數(shù)之前和main函數(shù)之后,而load方法是main函數(shù)之前的,而initialize方法是main函數(shù)之后到launchdidFinish方法的。下面我們來說一下這兩個方法的特性。
1.load 方法
至于load方法的底層有一篇文章已經分析的很透徹了我們就暫時不做研究主要說一下load函數(shù)的執(zhí)行特性。 load方法是在main函數(shù)之前執(zhí)行的也就是在運行時候也就是程序的類文件被裝載的時候調用的。 通常我們會在這里用Runtime的一些API 來控制我們的代碼。值得注意的是 load的方法執(zhí)行順序大概是 父類>>子類>> Category。 并且如果子類沒有實現(xiàn)load方法的話父類的load方法也不會被調用。
2.initialize方法
initialize方法是在第一次調用該類的方法的時候調用,但是這個方法有一個特點,就是就算子類沒有實現(xiàn)initialize方法 父類的initialize方法也會被調用。這個方法通常用作優(yōu)化APP的一些代碼
main()函數(shù)執(zhí)行前:
減少動態(tài)庫數(shù)量,可以合并動態(tài)庫
減少無用的方法和類,合并分類
減少 在load方法,試著用Initialize替代
減少atribute((constructor))的使用,控制全局變量數(shù)量
main()函數(shù)之后:
對業(yè)務進行模塊化處理,非首屏渲染業(yè)務應當盡量放到首屏渲染之后處理。
1.當類和類Category中l(wèi)oad方法都存在時,先調用類中l(wèi)oad方法,Category中l(wèi)oad方法后調用(注意:Category中l(wèi)oad晚于所有的類中l(wèi)oad方法調用)
2.父類load方法優(yōu)先于子類load方法(參考人類子類:XMMan和人類:XMPeople)
3.子類沒實現(xiàn)load方法,不會調用父類load方法(參考人類子類:XMWoman)
4.Category的load調用順序,與對應類之間的關系無關,與編譯順序一致(參考XMPeople(Category1)、XMPeople(Category2)、 XMMan(Category1)、XMMan(Category2))
5.類與類的Category中的load方法都會調用6.當有多個類時,load調用順序和類文件編譯順序有關(參考動物類:XMAnimal和人類:XMPeople)
1.如果類和類Category都實現(xiàn)了initialize方法,調用Category的initialize方法,會覆蓋類中的方法,只執(zhí)行一個,如果多個category,則調用編譯順序最后的initialize方法。(測試1)
2.如果父類和子類都實現(xiàn)了initialize方法,在調用子類時,如果父類的initialize方法調用過,則只調用子類initialize方法,如果父類沒用過,則先調用父類的Category的initialize方法,在調用子類的initialize方法(測試2)。如果調用子類的時候,已經初始化過父類的initialize,則在初始化父類的時候,不會再調用initialize方法(測試3)
3.如果子類沒有實現(xiàn)initialize方法,父類實現(xiàn)了initialize方法,調用子類的時候,會先調用父類的initialize方法,再調用子類的實例方法。(測試4)