iPhone開發必不可少的要用到這兩個方法。
他們均可以用來在視圖載入的時候,初始化一些內容。 可是他們有什麼區別呢?
viewDidLoad
此方法只有當view從nib文件初始化的時候才被調用。viewDidLoad用於初始化,加載時用到的。
loadView
此方法在控制器的view爲nil的時候被調用。 此方法用於以編程的方式建立view的時候用到。loadView是使用代碼生成視圖的時候,當視圖第一次載入的時候調用的方法。用於使用(寫)代碼來實現控件。用於使用代碼生成控件的函數。如:
- (
void ) loadView {
UIView *view
= [ [ UIView alloc] initWithFrame:[ UIScreen
mainScreen] .applicationFrame] ;
[ view
setBackgroundColor:_color] ;
self.view = view;
[ view release] ;
}
你在控制器中實現了loadView方法,那麼你可能會在應用運行的某個時候被內存管理控制調用。 若是設備內存不足的時候, view
控制器會收到didReceiveMemoryWarning的消息。
默認的實現是檢查當前控制器的view是否在使用。若是它的view不在當前正在使用的view
hierarchy裏面,且你的控制器實現了loadView方法,那麼這個view將被release,
loadView方法將被再次調用來建立一個新的view。
---------------------------------------------------------------------------------------------------------------------- 編程
--------------------------------------------------------------------------------------------------------------------------------------------- 數組
UIViewController 的內存管理
在 iOS3.0 後,UIViewController 多了一個叫作
viewDidUnLoad 的方法。
先看下 UIViewController 從建立 view
到展現的流程的幾個函數
-init
-initWithNibName:bundle:
這兩個方法都是初始化一個
vc,但請注意 view
不是這時候載入的
-loadView
-viewDidLoad
當一個視圖準備展示時,vc 首先會判斷
view 是否已經建立不然便經過以前指定的 xib 文件來初始化 view,以及綁定其餘關係(若沒有指定 xib 文件,則默認會搜索和 vc 同名的
xib,好比 myNameViewController 就會搜索 myNameViewController.xib 文件)
如果沒有
xib 文件,你就能夠在 loadview 中本身手動建立這個 viewControoler 須要的視圖。接下來就是調用到
-viewDidLoad,許多人喜歡在這裏作些其餘事情,好比作個 http 請求、創建個數組啥的。這裏若不處理正確,-viewDidUnload
激活時內存就容易泄露了,稍後提到。
-view()appear
-view()disappear
這幾個方法就不解釋了
-viewDidUnload
該方法在收到內存警告,同時該視圖並不在當前界面顯示時候會被調用,此時該
controller 的 view 已經被釋放並賦值爲 nil。
接下來你要作的是
把實例變量的子視圖釋放(IBOulet
的,以及本身添加的)
其餘實例變量,好比以前在 -viewDidLoaded 中實例的數據數組、http 請求釋放掉
由於當該
viewController 再次被激活準備顯示時(好比 navigationControler 返回到上一級),vc 發現本身的 view
爲空後會重複以前的流程直到把 view
給建立起來。若沒將本身額外添加的子視圖,各類類實例變量釋放,這裏便會從新再次建立。
因而,內存泄露了。 緩存
-------------------------------------------------------------------------------------------------------------------------------------------注意iphone開發中的這兩個函數viewWillAppear和viewDidAppear
每當視圖準備在屏幕上顯示,或者視圖已在屏幕上徹底顯示時,將調用這兩個方法。
viewWillAppear:方法更新準備顯示的視圖的信息。調用時,視圖可能尚未被加載。
使用viewDidAppear:來觸發視圖徹底顯示在屏幕上以後的行爲,例如任何動畫。
viewdidload是當程序第一次加載view時調用,之後都不會用到,而viewDidAppear是每當切換到view時就調用。
loadView和viewDidLoad方法。假設不使用xib文件對視圖佈局,那麼loadView方法必須設置屏幕,並對任何子視圖佈局。每當繼承一個具體的子類,例如UITableViewController或UITabBarController時,務必調用[super
loadView]或者實現viewDidLoad。這樣一來,在進行定製以前,父類能夠對屏幕進行適當的設置。當代碼基於具體的子類時,蘋果的文檔和示例代碼鼓勵使用viewDidLoad。
viewDidLoad
此方法只有當view從nib文件初始化的時候才被調用。viewDidLoad用於初始化,加載時用到的。
loadView
此方法在控制器的view爲nil的時候被調用。 此方法用於以編程的方式建立view的時候用到。loadView是使用代碼生成視圖的時候,當視圖第一次載入的時候調用的方法。用於使用(寫)代碼來實現控件。用於使用代碼生成控件的函數。
viewDidLoad
,不管是從xib中加載視圖,仍是從loadview生成視圖,都會被調用。 app
------------------------------------------------------------------------------------------------------------------------ iphone
loadView 和 viewDidLoad 是 iPhone 開發中確定要用到的兩個方法。 他們均可以用來在視圖載入的時候初始化一些內容。
可是他們有什麼區別呢?
viewDidLoad 方法只有當
view 從 nib 文件初始化的時候才被調用。viewDidLoad 用於初始化,加載時用到。
loadView 方法在控制器的 view 爲 nil
的時候被調用。 此方法用於以編程的方式建立 view 的時候用到。loadView
是使用代碼生成視圖的時候,當視圖第一次載入的時候調用的方法。用於使用(寫)代碼來實現控件。用於使用代碼生成控件的函數。如:
- ( void ) loadView {
UIView *view = [ [ UIView alloc] initWithFrame:[ UIScreen
mainScreen]
.applicationFrame] ;
[ view setBackgroundColor:_color] ;
self.view =
view;
[ view release] ;
}
你在控制器中實現了 loadView
方法,那麼你可能會在應用運行的某個時候被內存管理控制調用。 若是設備內存不足的時候, view 控制器會收到 didReceiveMemoryWarning
的消息。 默認的實現是檢查當前控制器的 view 是否在使用。 若是它的 view 不在當前正在使用的 view hierarchy 裏面,且你的控制器實現了
loadView 方法,那麼這個 view 將被 release, loadView 方法將被再次調用來建立一個新的 view。
nil是空的意思。至關於NULL。nil表示一個Objctive-C對象,這個對象的指針指向空(沒有東西就是空)。
首字母大寫的Nil和nil有一點不同,Nil定義一個指向空的類(是Class,而不是對象)。
在Objective-C裏,nil對象被設計來跟NULL空指針關聯的。他們的區別就是nil是一個對象,而NULL只是一個值。
在Objective-C中,你來對象在功能上等價於其餘不少語言中的NULL指針。區別是能夠對nil調用方法,而不致致使程序崩潰或拋出異常。 函數
--------------------------------------------------------------------------------------------------------------------- 佈局
1、loadView
永遠不要主動調用這個函數。view
controller會在view的property被請求而且當前view值爲nil時調用這個函數。若是你手動建立view,你應該重載這個函數。若是你用IB建立view並初始化view
controller,那就意味着你使用initWithNibName:bundle:方法,這時,你不該該重載loadView函數。
這個方法的默認實現是這樣:先尋找有關可用的nib文件的信息,根據這個信息來加載nib文件,若是沒有有關nib文件的信息,默認實現會建立一個空白的UIView對象,而後讓這個對象成爲controller的主view。
因此,重載這個函數時,你也應該這麼作。並把子類的view賦給view屬性(property)(你create的view必須是惟一的實例,而且不被其餘任何controller共享),並且你重載的這個函數不該該調用super。
若是你要進行進一步初始化你的views,你應該在viewDidLoad函數中去作。在iOS
3.0以及更高版本中,你應該重載viewDidUnload函數來釋聽任何對view的引用或者它裏面的內容(子view等等)。
這個網上的資料都說的很不全面,尤爲是藍色字部分。
2、viewDidLoad
這個函數在controller加載了相關的views後被調用,而不論這些views存儲在nib文件裏仍是在loadView函數中生成。而多數狀況下是作nib文件的後續工做。
3、viewDidUnload
這個函數是viewDidLoad的對立函數。在程序內存欠缺時,這個函數被controller調用,來釋放它的view以及view相關的對象。因爲controller一般保存這view以及相關object的引用,因此你必須使用這個函數來放棄這些對象的全部權以便內存回收。但不要釋放那些難以重建的數據。
一般controller會保存nib文件創建的views的引用,可是也可能會保存着loadView函數建立的對象的引用。最完美的方法是使用合成器方法:self.myCertainView = nil
這樣合成器會release這個view,若是你沒有使用property,那麼你得本身顯示釋放這個view。
網上對這個函數的描述含含糊糊,看了等於沒看。
4、結論
因此流程應該是這樣:
(loadView/nib文件)來加載view到內存
——>viewDidLoad函數進一步初始化這些view
——>內存不足時,調用viewDidUnload函數釋放views
—->當須要使用view時有回到第一步
如此循環 動畫
---------------------------------------------------------------------------------------------------------------------- spa
viewDidUnload方法
當系統內存吃緊的時候會調用該方法(注:viewController沒有被dealloc)
內存吃緊時,在iPhone OS 3.0以前didReceiveMemoryWarning是釋放無用內存的惟一方式,可是OS
3.0及之後viewDidUnload方法是更好的方式
在該方法中將全部IBOutlet(不管是property仍是實例變量)置爲nil(系統release
view時已經將其release掉了) 設計
-----------------------------------------------------------------------------------------------------------------------注意iphone開發中的這兩個函數viewWillAppear和viewDidAppear
每當視圖準備在屏幕上顯示,或者視圖已在屏幕上徹底顯示時,將調用這兩個方法。
viewWillAppear:方法更新準備顯示的視圖的信息。調用時,視圖可能尚未被加載。
使用viewDidAppear:來觸發視圖徹底顯示在屏幕上以後的行爲,例如任何動畫。
loadView和viewDidLoad方法。假設不使用xib文件對視圖佈局,那麼loadView方法必須設置屏幕,並對任何子視圖佈局。每當繼承一個具體的子類,例如UITableViewController或UITabBarController時,務必調用[super
loadView]或者實現viewDidLoad。這樣一來,在進行定製以前,父類能夠對屏幕進行適當的設置。當代碼基於具體的子類時,蘋果的文檔和示例代碼鼓勵使用viewDidLoad。
iPhone開發必不可少的要用到這兩個方法(loadView VS viewDidLoad
)。 他們均可以用來在視圖載入的時候,初始化一些內容。 可是他們有什麼區別呢?
viewDidLoad
此方法只有當view從nib文件初始化的時候才被調用。viewDidLoad用於初始化,加載時用到的。
loadView 此方法在控制器的view爲nil的時候被調用。
此方法用於以編程的方式建立view的時候用到。[font=lucida grande ]loadView是使用代碼生成視圖的時候,當視圖第一次載入的時候調用的方法。用於使用(寫)代碼來實現控件。用於使用代碼生成控件的函數。
viewDidLoad
,不管是從xib中加載視圖,仍是從loadview生成視圖,都會被調用。
---------------------------------------------------------------------------------------------------------------------
iPhone開發必不可少的要用到這兩個方法。他們均可以用來在視圖載入的時候,初始化一些內容。
可是他們有什麼區別呢?
viewDidLoad
此方法只有當view從nib文件初始化的時候才被調用。
loadView
此方法在控制器的view爲nil的時候被調用。此方法用於以編程的方式建立view的時候用到。
如:
-
(void)loadView {
UIView *view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame];
[view
setBackgroundColor:_color];
self.view = view;
[view release];
}
你在控制器中實現了loadView方法,那麼你可能會在應用運行的某個時候被內存管理控制調用。 若是設備內存不足的時候, view
控制器會收到didReceiveMemoryWarning的消息。 默認的實現是檢查當前控制器的view是否在使用。
若是它的view不在當前正在使用的view hierarchy裏面,且你的控制器實現了loadView方法,那麼這個view將被release,
loadView方法將被再次調用來建立一個新的view。
------------------------------------------------------------------------------------------------------------------------
loadView 和 viewDidLoad 是 iPhone
開發中確定要用到的兩個方法。
他們均可以用來在視圖載入的時候初始化一些內容。 可是他們有什麼區別呢?
viewDidLoad 方法只有當 view 從 nib
文件初始化的時候才被調用。viewDidLoad 用於初始化,加載時用到。
loadView 方法在控制器的 view 爲nil 的時候被調用。此方法用於以編程的方式建立 view 的時候用到。loadView
是使用代碼生成視圖的時候,當視圖第一次載入的時候調用的方法。用於使用(寫)代碼來實現控件。用於使用代碼生成控件的函數。如:
- ( void ) loadView {
UIView *view = [ [ UIView
alloc] initWithFrame:[ UIScreen
mainScreen] .applicationFrame] ;
[ view
setBackgroundColor:_color] ;
self.view = view;
[ view release]
;
}
你在控制器中實現了 loadView
方法,那麼你可能會在應用運行的某個時候被內存管理控制調用。若是設備內存不足的時候,view 控制器會收到 didReceiveMemoryWarning
的消息。 默認的實現是檢查當前控制器的 view 是否在使用。 若是它的 view 不在當前正在使用的 view hierarchy
裏面,且你的控制器實現了 loadView 方法,那麼這個 view 將被 release, loadView 方法將被再次調用來建立一個新的
view。
------------------------------------------------------------------------------------------------------------------------
viewDidUnload方法
當系統內存吃緊的時候會調用該方法(注:viewController沒有被dealloc)
內存吃緊時,在iPhone OS 3.0以前didReceiveMemoryWarning是釋放無用內存的惟一方式,可是OS
3.0及之後viewDidUnload方法是更好的方式。
------------------------------------------------------------------------------------------------------------------------
由init、loadView、viewDidLoad、viewDidUnload、dealloc的關係提及
init方法
在init方法中實例化必要的對象(聽從LazyLoad思想)
init方法中初始化ViewController自己
loadView方法
當view須要被展現而它倒是nil時,viewController會調用該方法。不要直接調用該方法。
若是手工維護views,必須重載重寫該方法
若是使用IB維護views,必須不能重載重寫該方法
loadView和IB構建view
你在控制器中實現了loadView方法,那麼你可能會在應用運行的某個時候被內存管理控制調用。 若是設備內存不足的時候, view
控制器會收到didReceiveMemoryWarning的消息。 默認的實現是檢查當前控制器的view是否在使用。 若是它的view不在當前正在使用的view
hierarchy裏面,且你的控制器實現了loadView方法,那麼這個view將被release,
loadView方法將被再次調用來建立一個新的view。
viewDidLoad方法
viewDidLoad
此方法只有當view從nib文件初始化的時候才被調用。
重載重寫該方法以進一步定製view
在iPhone OS
3.0及以後的版本中,還應該重載重寫viewDidUnload來釋放對view的任何索引
viewDidLoad後調用數據Model
viewDidUnload方法
當系統內存吃緊的時候會調用該方法(注:viewController沒有被dealloc)
內存吃緊時,在iPhone OS 3.0以前didReceiveMemoryWarning是釋放無用內存的惟一方式,可是OS
3.0及之後viewDidUnload方法是更好的方式
在該方法中將全部IBOutlet(不管是property仍是實例變量)置爲nil(系統release
view時已經將其release掉了)
在該方法中釋放其餘與view有關的對象、其餘在運行時建立(但非系統必須)的對象、在viewDidLoad中被建立的對象、緩存數據等
release對象後,將對象置爲nil(IBOutlet只須要將其置爲nil,系統release
view時已經將其release掉了)
通常認爲viewDidUnload是viewDidLoad的鏡像,由於當view被從新請求時,viewDidLoad還會從新被執行
viewDidUnload中被release的對象必須是很容易被從新建立的對象(好比在viewDidLoad或其餘方法中建立的對象),不要release用戶數據或其餘很難被從新建立的對象
dealloc方法
viewDidUnload和dealloc方法沒有關聯,dealloc仍是繼續作它該作的事情。
文章二:
viewDidUnload
該方法在收到內存警告,同時該視圖並不在當前界面顯示時候會被調用,此時該 controller 的 view
已經被釋放並賦值爲 nil。
接下來你要作的是
把實例變量的子視圖釋放(IBOulet 的,以及本身添加的)
其餘實例變量,好比以前在
-viewDidLoaded 中實例的數據數組、http 請求釋放掉
由於當該 viewController 再次被激活準備顯示時(好比
navigationControler 返回到上一級),vc 發現本身的 view 爲空後會重複以前的流程直到把 view
給建立起來。若沒將本身額外添加的子視圖,各類類實例變量釋放,這裏便會從新再次建立
---------------------------------------------------------------------------------------------------------------------
loadView 和 viewDidLoad 的區別
分享
loadView 和 viewDidLoad 是 iPhone 開發中確定要用到的兩個方法。
他們均可以用來在視圖載入的時候初始化一些內容。 可是他們有什麼區別呢?
viewDidLoad 方法只有當 view 從 nib
文件初始化的時候才被調用。viewDidLoad 用於初始化,加載時用到。
loadView 方法在控制器的 view 爲 nil 的時候被調用。
此方法用於以編程的方式建立 view 的時候用到。loadView
是使用代碼生成視圖的時候,當視圖第一次載入的時候調用的方法。用於使用(寫)代碼來實現控件。用於使用代碼生成控件的函數。如:
-
(void)loadView {
UIView * tmp=[[UIView alloc] initWithFrame:CGRectMake(0,
0, 320, 480)];
tmp.backgroundColor=[UIColor
orangeColor];
self.view=tmp;
[tmp release];
}
你在控制器中實現了
loadView 方法,那麼你可能會在應用運行的某個時候被內存管理控制調用。 若是設備內存不足的時候, view 控制器會收到
didReceiveMemoryWarning 的消息。 默認的實現是檢查當前控制器的 view 是否在使用。 若是它的 view 不在當前正在使用的 view
hierarchy 裏面,且你的控制器實現了 loadView 方法,那麼這個 view 將被 release, loadView
方法將被再次調用來建立一個新的 view。
----------------------------------------------------------------------------------------------------------------------
-(void)viewWillAppear:(BOOL)animated,- (void)viewDidLoad
的區別。
viewwillappear是每次視圖控制器的視圖出現前執行的代碼。而viewdidload是每次視圖控制器載入是執行的代碼。
好比說:當a視圖控制器的視圖第一次出現是兩個都要執行,但當a被push後有pop回來時,只有viewwillappear執行。
loadView 和 viewDidLoad 的區別
分享
loadView 和 viewDidLoad 是 iPhone 開發中確定要用到的兩個方法。 他們均可以用來在視圖載入的時候初始化一些內容。 可是他們有什麼區別呢? viewDidLoad 方法只有當 view 從 nib 文件初始化的時候才被調用。viewDidLoad 用於初始化,加載時用到。 loadView 方法在控制器的 view 爲 nil 的時候被調用。 此方法用於以編程的方式建立 view 的時候用到。loadView 是使用代碼生成視圖的時候,當視圖第一次載入的時候調用的方法。用於使用(寫)代碼來實現控件。用於使用代碼生成控件的函數。如: - (void)loadView { UIView * tmp=[[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)]; tmp.backgroundColor=[UIColor orangeColor]; self.view=tmp; [tmp release]; } 你在控制器中實現了 loadView 方法,那麼你可能會在應用運行的某個時候被內存管理控制調用。 若是設備內存不足的時候, view 控制器會收到 didReceiveMemoryWarning 的消息。 默認的實現是檢查當前控制器的 view 是否在使用。 若是它的 view 不在當前正在使用的 view hierarchy 裏面,且你的控制器實現了 loadView 方法,那麼這個 view 將被 release, loadView 方法將被再次調用來建立一個新的 view。