load initialize
一 、+load 調(diào)用時(shí)機(jī)
+load方法會(huì)在app啟動(dòng)的時(shí)候,只要類(lèi)被引用(子類(lèi)或父類(lèi)文件),就會(huì)默認(rèn)調(diào)用每個(gè)相關(guān)類(lèi)的 + load方法,只會(huì)調(diào)用一次,并且是在 main函數(shù)之前執(zhí)行的。
+load執(zhí)行順序
父類(lèi)》子類(lèi)》類(lèi)別;
不同子類(lèi),父類(lèi)的和子類(lèi)的Category的加載順序,根據(jù) Compile Sources中的順序執(zhí)行(最靠上的先執(zhí)行)。
舉例:
Student 和 Teacher都繼承自 Person;
Person兩個(gè)Category為Person+PersonCat和Person+PersonCat2;
Teacher 的 Category為Teacher+TeacherCat;
如圖:
+load 執(zhí)行的順序?Person》Student》Teacher》TeacherCat》PersonCat》PersonCat2
備注: TeacherCat-PersonCat-PersonCat2 ,調(diào)用順序?跟?Compile Sources中的文件順序有關(guān)。? Student-Teacher的+load調(diào)用順序?跟?Compile Sources中文件的順序有關(guān)?
二、+ initialize 方法調(diào)用時(shí)機(jī)
當(dāng)?shù)谝粋€(gè)類(lèi)實(shí)例加載前執(zhí)行+initialize,且只會(huì)調(diào)用一次,如果沒(méi)有再向類(lèi)發(fā)送消息的話,這個(gè)方法將不會(huì)被調(diào)用。
+ initialize執(zhí)行順序
舉例
Teacher 繼承自 Person,當(dāng)實(shí)例話Teacher時(shí):
如果Teacher的initialize沒(méi)有,Person的initialize會(huì)執(zhí)行兩次。
如果Teacher的initialize有,先執(zhí)行Person的initialize,在執(zhí)行Teacher的initialize。
如果 Teacher的Category(TeacherCat)和 Person(PersonCat)都有initialize,兩個(gè)分類(lèi)的方法會(huì)覆蓋原類(lèi)的initialize;且父類(lèi)分類(lèi)方法比子類(lèi)先執(zhí)行。
備注:最后一個(gè)類(lèi)別(Category)中的initialize方法會(huì)覆蓋之前類(lèi)別和類(lèi)中的initialize方法,如上圖的PersonCat2就是Person的最后一個(gè)類(lèi)別,他會(huì)覆蓋Person、PersonCat的initialize方法。
三、+load與+ initialize 小結(jié)
1、initialize和load,不需要在這兩個(gè)方法的實(shí)現(xiàn)中使用super調(diào)用父類(lèi)的方法。
2、initialize和load,被調(diào)用一次是相對(duì)runtime而言,你可以當(dāng)作普通類(lèi)方法多次調(diào)用。
3、類(lèi)加載到系統(tǒng)的時(shí)候就用調(diào)用load方法,類(lèi)首次使用的時(shí)候調(diào)用initialize方法。
4、load不像普通方法一樣遵從那套繼承規(guī)則,當(dāng)每個(gè)類(lèi)沒(méi)有實(shí)現(xiàn)load方法,不管各級(jí)超類(lèi)是否實(shí)現(xiàn),系統(tǒng)都不會(huì)調(diào)用此類(lèi)的load方法。
5、runtime調(diào)用+(void)load的時(shí)候,程序還沒(méi)有建立其autorelease pool,所以那些會(huì)需要使用到autorelease pool的代碼,都會(huì)出現(xiàn)異常。這一點(diǎn)是非常需要注意的,也就是說(shuō)放在+(void)load中的對(duì)象都應(yīng)該是alloc出來(lái)并且不能使用autorelease來(lái)釋放。
6、load方法調(diào)用的順序:父類(lèi)(Superclass)的方法優(yōu)先于子類(lèi)(Subclass)的方法,類(lèi)中的方法優(yōu)先于類(lèi)別(Category)中的方法。
7、所有類(lèi)別(Category)中的load方法都會(huì)執(zhí)行。
8、initialize執(zhí)行晚于load方法。9、+initialize調(diào)用是線程安全的。
總結(jié)
以上是生活随笔為你收集整理的load initialize的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 应用于arcgis的代码,长期更新…
- 下一篇: redis:CLUSTER cluste