2011-08-12 120 views
0

我相信我必須釋放一個對象,如果我用關鍵字init,alloc,copy或move創建它,我相信。我可以使用不使用此關鍵字的代碼創建對象,所以我想我不必將它們釋放正確?所以就拿這個代碼:何時發佈對象

UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
[button addTarget:self 
      action:@selector(aMethod:) 
forControlEvents:UIControlEventTouchDown]; 
[button setTitle:@"Hello" forState:UIControlStateNormal]; 
button.frame = CGRectMake(40.0, 200.0, 170.0, 40.0); 
[self.view addSubview:button]; 

,因爲我沒有使用任何在我的代碼我不應該釋放它的權利這些關鍵字的?那麼這個對象何時被釋放?我對記憶管理的東西有點困惑。

回答

3

您在此處創建的唯一對象是UIButton,並且您使用了buttonWithType類方法。這是返回你自動釋放的對象,所以你不必釋放它。

請記住,如果您稍後需要此按鈕,則需要保留該按鈕並最終將其釋放。由於您將此按鈕添加到視圖,因此視圖在此情況下保留副本,因此您不必擔心它。

+0

如果我保留一次,我需要稍後再發布它嗎? (以防我以後需要使用它),如果我保留兩次,我需要釋放它兩次?當我學習objective-c時,我閱讀了一個教程,解釋了這樣的內容... –

+0

正確 - 一旦對象的保留計數達到零,對象的內存就會釋放。每次保留對象時,保留計數都會增加。每次釋放對象時,保留計數都會遞增。自動釋放的對象只是系統稍後自動釋放的對象。如果你沒有保留它,它的保留計數將是1,因此只要系統釋放它就會被釋放。 –

+0

是的,你知道了! – mattacular

1

如果你正在運行XCode 4,我推薦運行'analyze'模式來運行內存泄漏的快速基本檢查......看起來很好(你的代碼)。

1

你是絕對正確的,你不必明確地發佈任何你不通過alloc,copy,new或retain取得所有權的東西。

在這種情況下,您已經通過便捷方法(buttonWithType :)創建了按鈕。這將返回一個自動發佈的UIButton對象。這是在運行循環結束時刷新autorelease池時自動釋放的。

這裏沒什麼好擔心的。讓運行時間來處理它。

1

有一個NSAutoreleasePool爲您管理內存。你對alloc和copy是正確的(alloc和init通常在一起),但不能移動。另一個返回保留對象的方法是前綴爲new ex的方法。 +(id)new;。每個線程都需要一個自動釋放池來管理每個事件循環的內存。

的按鈕實現可能如何看待

-(id)buttonWithType:(UIButtonType)type 
{ 
    UIButton *button = [[[UIButton alloc] initSecretlyWithType:type] autorelease]; 
    //Customize button if needed 
    return button; 
} 

詳情請參閱Using Autorelease Pools一個例子。