對不起,提出一個完全基本的問題,但如果我有一個保留的綜合屬性。將一個新的目標C對象分配給一個保留的屬性?
self.myProperty = [[NSObject alloc] init];
會造成內存泄漏嗎?
我也是糾正思想,我需要做的
self.myProperty = [[NSObject alloc] init];
[self.myProperty release];
爲了平衡?因爲這似乎愚蠢。
對不起,提出一個完全基本的問題,但如果我有一個保留的綜合屬性。將一個新的目標C對象分配給一個保留的屬性?
self.myProperty = [[NSObject alloc] init];
會造成內存泄漏嗎?
我也是糾正思想,我需要做的
self.myProperty = [[NSObject alloc] init];
[self.myProperty release];
爲了平衡?因爲這似乎愚蠢。
在這種情況下,標準做法是使用autorelease
。所以:
self.myProperty = [[[NSObject alloc] init] autorelease];
這是因爲init
返回保留的對象,因爲你的財產還保留了它,你就必須將其釋放。
編輯添加:@walkytalky在評論中提到了一個好點,它實際上保留了對象alloc
,init
只是返回它。
啓用ARC後,xcode將處理內存管理。 不使用ARC時,一定要在dealloc方法中釋放它。
所以我不需要釋放alloc後我想。謝謝。 – wbarksdale
你應該在dealloc中釋放它,而不是dealloc。一般來說,你不應該自己調用dealloc,當你正在釋放某些東西時,明顯的例外是'[super dealloc]'。 – vcsjones
如果您執行手動內存管理,通常會刪除dealloc方法中的所有對象。有一些蘋果的文件,我真的推薦!特別是「所有權轉移」是你應該知道的事情。 – guitarflow
Here is a thread你會發現有幫助。
你是對的。沒有ARC,任何被保留的財產也需要被釋放。
你也可以這樣做:
self.myProperty = nil;
從docs:
保留
指定保留應在物體時 分配調用。
以前的值發送釋放消息。
'self.myProperty = nil'沒有解決問題 - 它只會撤消屬性本身所做的保留,使'alloc'中的保留無法釋放。 – walkytalky
@walkytalky當你打電話給自己。myProperty = nil,[myProperty release]是從合成的setter中調用的,那麼爲什麼會在調用[myProperty release]時留下任何額外的懸掛? –
重讀這個問題。問題是'alloc'授予的不平衡所有權留置權。調用'[myProperty release]'釋放*那*,而不重置屬性值。財產的所有權語義是正確的。 – walkytalky
另一個(更詳細)技術是做:
NSObject *o = [[NSObject alloc] init]; //retain count 1
self.myProperty = o; //retain count 2
[o release]; //retain count 1
個人雖然,我可能只是使用自動釋放在上面的第一個例子。
請注意,在概念上,保留來自'alloc'。當然,由於'init'隨後返回對象,所以你說的也是如此。事實上,可能有'init'返回一個*不同*保留對象的情況,但傳統將保留與分配關聯而不是初始化(如在舊的NARC規則中)。 – walkytalky