2012-06-19 97 views
1

對不起,提出一個完全基本的問題,但如果我有一個保留的綜合屬性。將一個新的目標C對象分配給一個保留的屬性?

self.myProperty = [[NSObject alloc] init]; 

會造成內存泄漏嗎?

我也是糾正思想,我需要做的

self.myProperty = [[NSObject alloc] init]; 
[self.myProperty release]; 

爲了平衡?因爲這似乎愚蠢。

回答

2

在這種情況下,標準做法是使用autorelease。所以:

self.myProperty = [[[NSObject alloc] init] autorelease]; 

這是因爲init返回保留的對象,因爲你的財產還保留了它,你就必須將其釋放。

編輯添加:@walkytalky在評論中提到了一個好點,它實際上保留了對象allocinit只是返回它。

+0

請注意,在概念上,保留來自'alloc'。當然,由於'init'隨後返回對象,所以你說的也是如此。事實上,可能有'init'返回一個*不同*保留對象的情況,但傳統將保留與分配關聯而不是初始化(如在舊的NARC規則中)。 – walkytalky

0

啓用ARC後,xcode將處理內存管理。 不使用ARC時,一定要在dealloc方法中釋放它。

+0

所以我不需要釋放alloc後我想。謝謝。 – wbarksdale

+1

你應該在dealloc中釋放它,而不是dealloc。一般來說,你不應該自己調用dealloc,當你正在釋放某些東西時,明顯的例外是'[super dealloc]'。 – vcsjones

+0

如果您執行手動內存管理,通常會刪除dealloc方法中的所有對象。有一些蘋果的文件,我真的推薦!特別是「所有權轉移」是你應該知道的事情。 – guitarflow

0

Here is a thread你會發現有幫助。

你是對的。沒有ARC,任何被保留的財產也需要被釋放。

你也可以這樣做:

self.myProperty = nil; 

docs

保留

指定保留應在物體時 分配調用。

以前的值發送釋放消息。

+0

'self.myProperty = nil'沒有解決問題 - 它只會撤消屬性本身所做的保留,使'alloc'中的保留無法釋放。 – walkytalky

+0

@walkytalky當你打電話給自己。myProperty = nil,[myProperty release]是從合成的setter中調用的,那麼爲什麼會在調用[myProperty release]時留下任何額外的懸掛? –

+0

重讀這個問題。問題是'alloc'授予的不平衡所有權留置權。調用'[myProperty release]'釋放*那*,而不重置屬性值。財產的所有權語義是正確的。 – walkytalky

0

另一個(更詳細)技術是做:

NSObject *o = [[NSObject alloc] init]; //retain count 1 
self.myProperty = o;     //retain count 2 
[o release];       //retain count 1 

個人雖然,我可能只是使用自動釋放在上面的第一個例子。

相關問題