我注意到,蘋果的一些例子包括一個retain
和readonly
屬性修改器。如果我們使用readonly
修飾符時沒有生成setter,那麼包括retain
在內的什麼含義?爲什麼聲明的屬性同時使用保留和只讀?
示例:來自AnimatedTableView示例的@property (retain, readonly) NSString *title;
。
我注意到,蘋果的一些例子包括一個retain
和readonly
屬性修改器。如果我們使用readonly
修飾符時沒有生成setter,那麼包括retain
在內的什麼含義?爲什麼聲明的屬性同時使用保留和只讀?
示例:來自AnimatedTableView示例的@property (retain, readonly) NSString *title;
。
您可以在類擴展中包含第二個私有讀寫聲明。所有引用的內存管理方案都需要與IIRC相匹配,因此你會得到像「只讀,保留」這樣的愚蠢行爲。
或者,更具體地,(只讀,保留)使這樣的圖案:
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
- 但它會比有利於更加混亂。整個組合中也存在一系列不同的邊緣情況,這些情況同樣值得警告,但並不真正表明存在實際問題。爲了簡單起見,決定在很大程度上接受各種模式而沒有抱怨(因爲它們不是正確性問題)。
這不是完全愚蠢的;修飾符與@synthesize的矩陣是這樣的,使得getter的代碼**可以改變。試圖明確哪些修飾符應該能夠被添加,哪些應該#warn會充斥細節並且很難最終理解。最好簡單地去「除readonly-> readwrite之外必須是相同的」。 – bbum
想象一下,我應該擴充我的評論.... – bbum