2011-07-19 152 views
1

我完全不明白這一點。iPhone內存管理

如果我寫:

NSNumber *number = [NSNumber initWithInteger: 5]; 

我必須將它釋放?這是相同的: NSNumber * number = [NSNumber alloc];

+4

[相關和重要](http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html%23//apple_ref/doc/uid/10000011-SW1)。如果你還沒有,你必須**閱讀它。 – 2011-07-19 12:48:42

回答

5

您不會撥打NSNumber *number = [NSNumber initWithInteger: 5];,因爲NSNumber不響應+ initWithInteger:。實際上,你需要通話雙方+alloc-initWithInteger:,像這樣:

NSNumber *number = [[NSNumber alloc] initWithInteger:5]; 

然後,你必須在以後釋放;對於你所做的每個分配調用,你也應該打電話來發布。

NSNumber *number = [NSNumber numberWithInteger:5]; 

方法這樣返回自動釋放對象,這意味着你不需要自己以後釋放它:


或者,你可以使用下面的類方法得到一個自動釋放NSNumber

+0

+1,確實沒有這樣的方法。另一種方法是:[[[NSNumber numberWithInteger:5] retain];' – 2011-07-19 12:49:27

+0

,如果我只輸入NSInteger * integer = 5; 我必須發佈嗎? – vburojevic

+1

@Wikiboo'NSInteger'只是一個普通的舊類型(類似於int,float,double和char)。這不是一堂課。它不是'NSNumber'的子類。而'NSInteger * integer = 5;'是錯誤的:你給一個指針指定一個常量,除了'NULL','nil'和'Nil'外,你永遠不應該這樣做(刪除星號並且你很好)。不,你不應該釋放也不能釋放POD(普通的舊類型),因爲它們是由編譯器預先分配的,而不是在運行時分配的。 – 2011-07-19 12:50:11

0

首先,沒有一個名爲 「+(ID)initWithInteger:」 類方法的NSNumber類。這應該是「+(id)numberWithInteger:

你不應該釋放它。 「[NSNumber numberWith ...」等構造函數被稱爲方便的構造函數。他們返回自動釋放對象。所以,你不必擔心釋放它們。

+0

小心,他正在寫「initWithInteger」 – phi

+0

上帝!我沒有注意到它。謝謝 ;-) – EmptyStack

2

「一般的經驗法則是:如果您分配,複製或新增內存管理功能。」

我會爲此添加保留。