1.? loadView
使用場景:
當(dāng)控制器的view初始化的時候調(diào)用 作用:初始化控制器的view(如:使imageView成為控制器的view)
它比viewDidLoad更先一步執(zhí)行
2.? load和initialize的區(qū)別:(類方法)
//load 什么時候調(diào)用: 當(dāng)程序已啟動的時候就會調(diào)用
// 作用: 把當(dāng)前類加載進(jìn)內(nèi)存,放在代碼區(qū)
//initialize 什么時候調(diào)用: 當(dāng) 當(dāng)前類/子類 第一次初始化當(dāng)前類的時候調(diào)用
// 作用: 初始化這個類(如自定義一個nav 然后在赶撰。m文件里面初始化這個類 設(shè)置nav的背景,文字大小等等)
Apple的文檔很清楚地說明了initialize和load的區(qū)別在于:load是只要類所在文件被引用就會被調(diào)用谬墙,而initialize是在類或者其子類的第一個方法被調(diào)用前調(diào)用咧七。所以如果類沒有被引用進(jìn)項目蚕捉,就不會有l(wèi)oad調(diào)用岩梳;但即使類文件被引用進(jìn)來尤慰,但是沒有使用,那么initialize也不會被調(diào)用蛔外。
它們的相同點在于:方法只會被調(diào)用一次蛆楞。
總結(jié)
load和initialize方法都會在實例化對象之前調(diào)用,以main函數(shù)為分水嶺夹厌,前者在main函數(shù)之前調(diào)用豹爹,后者在之后調(diào)用。這兩個方法會被自動調(diào)用矛纹,不能手動調(diào)用它們臂聋。
load和initialize方法都不用顯示的調(diào)用父類的方法而是自動調(diào)用,即使子類沒有initialize方法也會調(diào)用父類的方法崖技,而load方法則不會調(diào)用父類逻住。
load方法通常用來進(jìn)行Method Swizzle,initialize方法一般用于初始化全局變量或靜態(tài)變量迎献。
load和initialize方法內(nèi)部使用了鎖,因此它們是線程安全的腻贰。實現(xiàn)時要盡可能保持簡單吁恍,避免阻塞線程,不要再使用鎖播演。
使用場景:
將針對于類修改放在intialize中冀瓦,將針對Category的修改放在load中。
但是假如我們是修改系統(tǒng)的類写烤,一般會通過添加Category來添加功能翼闽,但是如果修改initialize會導(dǎo)致原生的intialize不會執(zhí)行,所以放在load中會比較妥當(dāng)洲炊。
3.reloadData
// 在開發(fā)中不建議
// 當(dāng)數(shù)據(jù)量特別大的時候,不要隨意刷新,防止卡頓
[self.tableView reloadData];
4.layoutSubviews
使用場景:自定義控件的時候用到 設(shè)置位置
- (void)layoutSubviews{
[super layoutSubviews];
}
5. -init 和 +initialize的區(qū)別:
01.只要new一次感局,init就會調(diào)用一次尼啡,new多少次,init就調(diào)用多少次询微,但initialize只會調(diào)用一次崖瞭。
02.如果子類沒有實現(xiàn)initialize的重寫,在子類收到消息的時候撑毛,會調(diào)用兩次initialize,一次是父類調(diào)用的书聚,一次是子類調(diào)用的。
執(zhí)行順序:initialize -> init -> viewDidLoad
6.
普通類的方法
init
initialize:
控制器類的方法
init
initialize:
initWithCoder:
UI控件類的方法
init
initialize:
initWithCoder:
initWithFrame: