2011-05-30 26 views
1

這是處理記憶的正確方法嗎?Relaese,Alloc和Nil的一個對象?

方法1:沒有崩潰

UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(220.0f, 7.0f, 57.0f, 35.0f)] ; 

    button = nil; 

    [button release]; 

方法2:用崩潰

UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(220.0f, 7.0f, 57.0f, 35.0f)] ; 

    [button release]; 

    button = nil; 

回答

0

兩者都不正確。您應該使用類方法buttonWithType:構造按鈕。它將根據您的指定設置類型。按鈕不應直接放置/直接放置。 (也許這是崩潰發生的地方,儘管它不應該)

該類方法將返回一個自動釋放對象,所以你不能釋放它。

儘管如此(即與其他對象和普通的alloc/init),第二種方法是正確的;第一次泄漏。

1

無需設置變量,抱着你分配的對象,到零。只要釋放它,如果你不再需要它。而已。

+0

將變量設置爲零是很好的做法,因爲當你不這樣做時,如果稍後向變量發送消息,則會因爲嘗試將消息發送到釋放的實例而發生崩潰。如果將其設置爲零,則只會得到零結果,程序將繼續運行。嘗試'NSMutableString * str = [[NSMutableString alloc] initWithString:@「bla」]; NSLog(@「rc =%d」,[str retainCount]); [str release]; str = nil; NSLog(@「rc =%d」,[str retainCount]);' - 這會運行。取消'str = nil',你會發生崩潰。 – fzwo 2011-05-30 08:15:40

1

第一個不正確,以及內存泄漏的情況。

第二種方法是由所有的我們大多數人,它不應該被撞壞,

郵政相關的代碼與方法2#。

+0

不可以。您不應該在UIButton中使用init,而應該使用buttonWithType:。 – Eiko 2011-05-30 08:05:52

+0

@ Eiko:使用buttonWithType並不是強制性的,它只是開發人員某個時間選擇的要求之一。 init方法也可以使用。 – Jhaliya 2011-05-30 08:14:46

+0

蘋果公司的文件有不同的說法。而且以後不能設置按鈕類型。它是隻讀的。 – Eiko 2011-05-30 21:12:00

0

爲什麼你設置button = nil;按鈕值爲零,之後[button release];你不需要做只是做[button release];和您的按鈕將無任何泄漏被釋放。

+0

因爲有人可能會保留該變量並仍然嘗試使用它,如果您沒有設置爲零,這會導致崩潰;看到我的評論以解除答案。 – fzwo 2011-05-30 08:17:01

相關問題