2011-06-13 77 views
6

我有一個UIViewController子類,我試圖找出重寫什麼,以便我可以運行一些初始化代碼只有一個對象實例。什麼地方初始化一個UIViewController的東西

viewDidLoad方法可能看起來像是明顯的答案,但問題是如果控制器由於內存警告而重置視圖,則viewDidLoad可能會運行多次。 initWithNibName:bundle:,initinitWithCoder:方法似乎也是不錯的選擇,但哪一個可以重寫? awakeFromNib方法是另一個考慮因素,但這似乎並未在我的視圖控制器中執行。

有沒有辦法做到這一點,我失蹤了?

回答

4

您或許仍然可以使用viewDidLoad,但在裏面使用靜態布爾值來查看您是否已經在那裏。

static BOOL didInitialize = NO; 
if (didInitialize == YES) 
    return; 

didInitialize = YES; 
/* initialize my stuff */ 
+0

我想我的問題並不清楚。我的意思是我的對象實例,但我認爲同樣的方法可以用於對象變量。 – chris 2011-06-13 19:35:25

2

+(void)initialize怎麼樣?據我瞭解,這是iOS爲你調用的一個類初始化程序,一次。

+0

記得檢查'if(self == [MyViewController class])'。 – 2011-06-13 19:08:03

+0

當對象從筆尖拆包時,會調用+(void)initialize嗎?否則,所需的初始化可能無法正確執行。 – 2011-06-13 19:13:01

+0

如果它是從一個筆尖加載的,您可以實現' - (void)awakeFromNib'爲重構對象執行一次性設置。但這不是類初始化;這是一次性設置的筆尖對象的每個實例。不同。 – 2011-06-13 19:24:47

5

UIViewControllers的指定初始化,其他所有初始化都應該調用該方法,是-initWithNibName:bundle:。如果您想在創建視圖控制器時初始化某些內容,請覆蓋該方法。

-viewDidLoad適用於依賴於控制器視圖的任何設置。正如您指出的那樣,該方法可能會運行多次,因爲視圖可能會多次加載。 -awakeFromNib不會幫助,除非你的視圖控制器本身存在於一個筆尖中,並且即使這樣,只有當你正在初始化的東西依賴於同一個筆尖中的其他對象時纔有意義。

+0

如果我沒有弄錯,'-initWithFrame:'不是UIViewController的一個方法,所以我不認爲這會起作用。也許你的意思是'initWithNibName:bundle:'? – chris 2011-06-13 20:00:56

+0

Doh。你是對的,當然......我在想UIView,而不是UIViewController。我會修復這個帖子。 – Caleb 2011-06-13 20:04:54

+0

這個答案是正確的。只有一個init方法應該運行你的初始化代碼,其他的init方法應該調用init方法。 – 2011-06-13 20:35:48

相關問題