我有一些關於Objective-C中合成屬性的問題。完整列表如下,但基本問題是這樣的:即使我的代碼可能包含或不包含dealloc中的發佈方法,編譯器如何確保合成屬性的ivars被正確釋放?@synthesized retain屬性如何處理髮布?
注:我決定不發佈這些個別問題,因爲他們是如此密切相關,因爲有現存的問題了一把該在個別問題上的觸摸沒有真正得到到問題的心臟。
有點類似的問題:
- Does property retain need a release?
- What's the difference between property and synthesize?
- Question on retain attribute with property and synthesize
設置:考慮一類具有一個屬性:
@interface Person : NSObject
{
NSString * name;
}
@property (nonatomic, retain) name;
@end
問題1:非常基本情況:
@implementation Person
@synthesize name;
@end
在此設置下,我認爲name
將每當Person
對象被釋放被自動釋放。在我看來,編譯器只是簡單地將[name release]
插入到dealloc
方法中,就好像我自己輸入了一樣。那是對的嗎?
問題2:如果我選擇寫我自己的dealloc
方法這個類,我忽略到[name release]
一個電話,就會把漏?
@implementation Person
@synthesize name;
- (void)dealloc { [super dealloc]; }
@end
問題3:如果我選擇寫我自己的dealloc
方法這個類,我包括到[name release]
一個電話,將這一結果在雙釋放,因爲@synthesize
已經爲我照顧過了嗎?
@implementation Person
@synthesize name;
- (void)dealloc { [name release]; [super dealloc]; }
@end
問題4:如果我選擇寫這個類我自己的屬性訪問,但我不寫我自己的dealloc
方法,將name
被泄露?
@implementation Person
@dynamic name;
- (void)setName:(NSString *)newName
{
[newName retain];
[name release];
name = newName;
}
@end
問題5:我有一種感覺,(根據經驗)認爲上述情況沒有會導致泄漏或雙版本,因爲該語言的設計是爲了避免他們。當然,這提出了「如何?」的問題。編譯器是否足夠聰明以跟蹤每一個可能的情況?如果我是做到以下幾點(注意,這是一個可笑的例子,只是爲了說明我的觀點):
void Cleanup(id object) { [object release]; }
@implementation Person
@synthesize name;
- (void)dealloc { Cleanup(name); }
@end
將這種欺騙編譯器爲增加另一個[name release]
到dealloc
方法?
謝謝你的詳細解答。我很高興我問過! – 2010-02-03 06:27:07
非常好解釋! – 2013-05-01 11:41:22