2011-11-18 34 views
2

請問這兩個片段完成同樣的事情?假設我有三個IBOutlet中UIButtons我叫buttonOne,buttonTwo接口文件,並buttonThree:自動化的dealloc/viewDidUnload Objective-C的

- (void)dealloc { 
    for(UIButton* idx in self.view.subviews) 
     [idx release], idx = nil; 

    [super dealloc]; 
} 

- (void)dealloc { 
    [buttonOne release], buttonOne = nil; 
    [buttonTwo release], buttonTwo = nil; 
    [buttonThree release], buttonThree = nil; 
    [super dealloc]; 
} 

編輯:

電弧有時好像是一個修復,所有替代內存管理在iOS中,我不喜歡使用它,因爲a)我覺得我是作弊,b)如果我沒有弄錯,它只適用於iOS 5設備。

+0

回覆:編輯B,你就錯了。完整的ARC適用於iOS 4.3,除了弱點之外,您可以在iOS 4.2上獲得大部分ARC功能,您可以使用unsafe_unretained。 – NJones

+0

哦,天哪,我非常非常錯誤! ARC聽起來很夢幻,我要檢查一下。感謝您的推薦! –

回答

5

假設您沒有任何其他子視圖,那麼這兩段代碼也會執行相同的操作。但這不是你應該做的事情。

你應該聲明你的店鋪weak(如果使用ARC)或assign(如果不使用ARC)。那麼你不必在dealloc中發佈它們。 A UIView保留其子視圖並在釋放它們時釋放它們,因此您不需要保留或釋放它們。你只要釋放self.view(或者,如果你的UIViewController一個子類,你讓[super dealloc]照顧釋放self.view的)。

+0

這是不正確的,你應該使用Strong(如果使用ARC)並保留,如果不使用ARC。否則,如果您的視圖在低內存條件下卸載,那麼您的所有網點都將消失,您可能還想在釋放它們之前先對它們進行操作。 –

+0

從蘋果公司的* [資源編程指南(http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/CocoaNibs.html#//apple_ref/doc/uid/10000051i-CH4 -SW6)*:「除了從文件所有者到nib文件中的頂級對象(或者在iOS中,一個故事板場景),這些應該是」強大的「,出口通常應該是弱的。你可以在'didReceiveMemoryWarning'中「對他們做些什麼」。 –

+0

你是對的,我沒有使用過ARC,但是自從ARC IBOutlets聲明爲保留之前就假設他們在ARC中會很強壯,但我發現他們很弱以避免強烈的參考週期。如果你不使用ARC,你應該使用retain not assign。如果你可以編輯你的答案,我會加倍努力,對不起,這是我的錯誤。 –

0

不,他們不會第一個瀏覽視圖子視圖中的所有視圖,所有的foreach都會將其轉換爲UIButton,但是您正在遍歷視圖子視圖數組的所有內容。

- (void)dealloc { 
    for(UIButton* idx in self.view.subviews) 
    { 
     if([idx isKindOfClass:UIButton]) 
     { [idx release] } 
    } 
    [super dealloc]; 
} 
0

是的,沒有 如果您有任何其他意見,然後子視圖這些也將在第一個方法可以釋放,但沒有第二個。 否則,如果只有按鈕是子視圖,那麼是這兩件事情會有相同的結果。

我建議尋找到ARC,所以你不必擔心任何此內存管理業務。