不是所有的getter採取這種形式:
- (id)variable { return variable; }
...這僅僅是最原始的形式。單獨屬性應該建議更多的組合,這會改變實施。上面的原始訪問器沒有考慮與內存管理,原子性或複製語義結合使用的習語。在子類覆蓋中實現也很脆弱。
接下來是一些非常簡短的例子;在實現變得相當複雜的實際程序中事情顯然變得更加複雜。
1)getter可能不會返回實例變量。以下幾種可能性之一:
- (NSObject *)a { return [[a copy] autorelease]; }
2)setter可能不保留實例變量。以下幾種可能性之一:
- (void)setA:(NSObject *)arg
{
...
a = [arg copy];
...
}
3)您最終在整個程序中實施了內存管理,這使得難以維護。類的語義(以及如何處理實例變量裁判計數)應保持到類,並按照約定的預計業績:
- (void)stuff:(NSString *)arg
{
const bool TheRightWay = false;
if (TheRightWay) {
NSMutableString * string = [arg mutableCopy];
[string appendString:@"2"];
self.a = string;
[string release];
// - or -
NSMutableString * string = [[arg mutableCopy] autorelase];
[string appendString:@"2"];
self.a = string;
}
else {
NSMutableString * string = [arg mutableCopy];
[string appendString:@"2"];
self.a = string;
[self.a release];
}
}
沒有遵守這些簡單的規則,使你的代碼難以維護和調試和痛苦的擴展。
所以它的缺點是,你想讓你的程序容易維護。直接在一個屬性上調用release會要求你瞭解這個類的內部運作的很多背景;這顯然很糟糕,錯過了很好的OOD理想。
它也期望作者/子類/客戶確切地知道班級是如何偏離約定的,當問題出現時這很愚蠢和耗時,當問題出現時你必須重新學習所有內部細節(他們會在某個時間點)。
這些是一些簡單的例子,說明如何調用釋放屬性的結果引入問題。許多現實世界的問題都更加微妙和難以定位。
這是一個非常危險的建議;吸氣劑並不總是這樣。事實上,如果這是一個「原子」屬性,它會保留/ -autorelease。 – bbum