保留對象的設置器是否自動首先釋放對象?保留屬性保留/釋放合成設置器
我還沒有ARC工作,因此我有這些問題。
假設我有一個的ivar這種方式定義的:
ObjectClass *anObject_;
隨着歡迎使用屬性
@property (nonatomic, retain) ObjectClass *anObject;
而且合成使用
@synthesize anObject = anObject_;
如果我有正在使用自動合成的設定器保留屬性,如果需要,setter將首先執行發佈?像這樣:
- (void) setAnObject:(ObjectClass*)anObject {
if (anObject_) [anObject_ release];
anObject_ = [anObject retain];
}
並能在簡單地進行分配的對象,而無需首先釋放它?
我可以通過將屬性分配給無來釋放對象嗎?(如果有其他業主,這可能是不安全的。)
self.anObject = nil;
換句話說,我可以用if (anObject_) [anObject_ release];
代碼分配的setter之外,讓合成的二傳手我做到這一點?
如果我編寫自己的setter,是否需要添加/包含保留?如果一個合成的setter包含發佈(這是我最初的問題),我需要添加/包含這個,在我自己的setter ?
最後一件事 - 當使用ARC時,我假設self.anObject = nil;
和self.anObject = anthingelse;
都是安全的?無論我的代碼是,原始對象都將被髮布?
如果我理解正確的話,我可以將保留的屬性值設置爲零(或任何其他值),並且這將始終釋放第一個即使當我編寫了明確的setter包括'if(anObject_ )[anObject_ release];'代碼。你能證實這一點嗎? – Draco 2012-02-21 23:01:39
如果你寫了一個setter,然後將它的屬性設置爲'nil',那麼即使你沒有在你編寫的setter中調用'release',也會在舊對象值上調用release。事實上,當你使用ARC時,你不允許**在你的setter(或其他地方)調用'release'。 – yuji 2012-02-21 23:03:38