日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

oc---类方法load和initialize的区别

發(fā)布時(shí)間:2023/12/20 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oc---类方法load和initialize的区别 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在iOS開發(fā)中,就像Application有生命周期回調(diào)方法一樣,在Objective-C的類被加載和初始化的時(shí)候,也可以收到方法回調(diào),可以在適當(dāng)?shù)那闆r下做一些定制處理。而這正是本篇文章所要介紹的load和initialize方法可以幫我們做到的。
load和initialize的共同特點(diǎn)
load和initialize有很多共同特點(diǎn),下面簡(jiǎn)單列一下:
● 在不考慮開發(fā)者主動(dòng)使用的情況下系統(tǒng)最多會(huì)調(diào)用一次
● 如果父類和子類都被調(diào)用,父類的調(diào)用一定在子類之前
● 都是為了應(yīng)用運(yùn)行提前創(chuàng)建合適的運(yùn)行環(huán)境
● 在使用時(shí)都不要過(guò)重地依賴于這兩個(gè)方法,除非真正必要
+load方法
● 調(diào)用時(shí)機(jī)比較早,運(yùn)行環(huán)境有不確定因素。具體說(shuō)來(lái),通常都是App啟動(dòng)前進(jìn)行調(diào)用,當(dāng)load調(diào)用的時(shí)候,并不能保證所有類都加載完成且可用,必要時(shí)還要自己負(fù)責(zé)做auto release處理.
● 對(duì)于一個(gè)類,如果沒(méi)有實(shí)現(xiàn)load方法就不會(huì)調(diào)用,不會(huì)考慮對(duì)NSObject的繼承.
● 父類的load方法會(huì)優(yōu)先于子類調(diào)用,類別的load方法一般最后調(diào)用不會(huì)直接觸發(fā)initialize的調(diào)用。
通俗的講就是: 在程序啟動(dòng)之前會(huì)調(diào)用所有的類的(手動(dòng)實(shí)現(xiàn)的)+load方法(沒(méi)有實(shí)現(xiàn)就不調(diào)用咯),按(父類->子類->類別)的順序調(diào)用.
+initialize方法
● initialize的自然調(diào)用是在第一次主動(dòng)使用當(dāng)前類的時(shí)候 (第一次 alloc 時(shí))
● 在initialize方法收到調(diào)用時(shí),運(yùn)行環(huán)境基本健全。
● initialize的運(yùn)行過(guò)程中是能保證線程安全的。
● 和load不同,即使子類不實(shí)現(xiàn)initialize方法,會(huì)把父類的實(shí)現(xiàn)繼承過(guò)來(lái)調(diào)用一遍。注意的是在此之前,父類的方法已經(jīng)被執(zhí)行過(guò)一次了,同樣不需要super調(diào)用。
通俗的講就是:在程序啟動(dòng)之后,在第一次創(chuàng)建這個(gè)類的對(duì)象的時(shí)候(也就是分配內(nèi)存空間alloc的時(shí)候),會(huì)調(diào)用該類的+initialize方法且只調(diào)用一次.
[調(diào)用順序 1.如果父類的initialize方法沒(méi)有被調(diào)用過(guò)會(huì)先調(diào)用父類的initialize方法) 2.如果該類有類別只會(huì)調(diào)用類別的+initialize(如果有多個(gè)類別會(huì)調(diào)用某一個(gè)類別的initialize方法,其他的不會(huì)調(diào)用)]
由于initialize的這些特點(diǎn),使得其應(yīng)用比load要略微廣泛一些??捎脕?lái)做一些初始化工作,或者單例模式的一種實(shí)現(xiàn)方案。
Apple的文檔很清楚地說(shuō)明了initialize和load的區(qū)別在于:load是只要類所在文件被引用就會(huì)被調(diào)用,而initialize是在類或者其子類的第一個(gè)方法被調(diào)用前調(diào)用。所以如果類沒(méi)有被引用進(jìn)項(xiàng)目,就不會(huì)有l(wèi)oad調(diào)用;但即使類文件被引用進(jìn)來(lái),但是沒(méi)有使用,那么initialize也不會(huì)被調(diào)用。

上代碼: - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {// Override point for customization after application launch.NSLog(@"appdelegate");self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];self.window.backgroundColor = [UIColor blackColor];ViewController *vc = [[ViewController alloc] init];UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:vc];self.window.rootViewController = nav;[self.window makeKeyAndVisible];return YES; }

如上 所有的+load方法會(huì)在 NSLog(@”appdelegate”) 之前被調(diào)用.
如圖:

+(void)load方法的調(diào)用順序:Father > Son > Daughter > GrandSon > Father+Cry > Son+Eat > Father+Laugh
而+initialize方法基本上都是在 NSLog(@”appdelegate”) 之后被調(diào)用.
如下
[Son alloc];
會(huì)觸發(fā)父類 (如果父類沒(méi)有被alloc過(guò))的initialize方法,由于類別(Category)中的initialize方法會(huì)覆蓋之前類別和類中的initialize方法,所以只會(huì)調(diào)用兩個(gè)initialize方法 即 Father+LaughInitialize > Son+EatInitialize .

轉(zhuǎn)載于:https://www.cnblogs.com/frankltf/p/7059624.html

總結(jié)

以上是生活随笔為你收集整理的oc---类方法load和initialize的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。