2009-12-19 38 views
24

我注意到,蘋果的一些例子包括一個retainreadonly屬性修改器。如果我們使用readonly修飾符時沒有生成setter,那麼包括retain在內的什麼含義?爲什麼聲明的屬性同時使用保留和只讀?

示例:來自AnimatedTableView示例的@property (retain, readonly) NSString *title;

回答

17

您可以在類擴展中包含第二個私有讀寫聲明。所有引用的內存管理方案都需要與IIRC相匹配,因此你會得到像「只讀,保留」這樣的愚蠢行爲。

+3

這不是完全愚蠢的;修飾符與@synthesize的矩陣是這樣的,使得getter的代碼**可以改變。試圖明確哪些修飾符應該能夠被添加,哪些應該#warn會充斥細節並且很難最終理解。最好簡單地去「除readonly-> readwrite之外必須是相同的」。 – bbum

+0

想象一下,我應該擴充我的評論.... – bbum

36

或者,更具體地,(只讀,保留)使這樣的圖案:

foo.h中:

@interface StuffHolder:NSObject 
@property(readonly, retain) MyStuff *stuff; 
@end 

Foo.m:

@interface StuffHolder() 
@property(readwrite, retain) MyStuff *stuff; 
@end 

@implementation StuffHolder 
@synthesize stuff; 
@end 

最終的結果是一個在執行過程中讀寫時公開讀取的屬性,並且編譯器自動合成setter和getter。

可以在任何的情況下會產生警告(讀寫,保留)在類擴展覆蓋 - 一個類似於statement without an effect - 但它會比有利於更加混亂。整個組合中也存在一系列不同的邊緣情況,這些情況同樣值得警告,但並不真正表明存在實際問題。爲了簡單起見,決定在很大程度上接受各種模式而沒有抱怨(因爲它們不是正確性問題)。

+0

它被宣稱爲只讀,但如果編譯器爲它生成了setter,它仍然是可寫的,不是嗎? – dreamlax

+1

如果有人編寫代碼來調用setter,當然,但沒有在某處聲明方法,他們將看到一個警告...... – bbum

+0

「Public」只讀屬性(在頭中聲明)和「private」保留屬性(在源文件中聲明)不再支持(使用Xcode 3.2.3 - iPhone SDK 4和GCC 3.2) 錯誤:綜合屬性'x'和'y'都聲稱ivar'z' – Felix

相關問題