在閱讀初學者的iPhone開發者書籍並在線閱讀示例代碼之後,我注意到大多數Objective C程序員幾乎綜合了所有實例變量。一些變量可以方便地進行優化,但是在遵守面向對象的封裝原則時,大多數變量不應該這樣做。最差的是合成屬性標記爲私人。試圖使用別人代碼的C++程序員將讀取頭文件中的公共字段和方法。他們將跳過私有變量。此C++程序員不會知道您希望以某種有意義的方式使用私有屬性。是一個私人綜合財產矛盾嗎?
看看蘋果提供lazy table image loading此樣本模板:
頭
@interface ParseOperation : NSOperation <NSXMLParserDelegate>
{
@private
id <ParseOperationDelegate> delegate;
NSData *dataToParse;
NSMutableArray *workingArray;
AppRecord *workingEntry;
NSMutableString *workingPropertyString;
NSArray *elementsToParse;
BOOL storingCharacterData;
}
來源
@interface ParseOperation()
@property (nonatomic, assign) id <ParseOperationDelegate> delegate;
@property (nonatomic, retain) NSData *dataToParse;
@property (nonatomic, retain) NSMutableArray *workingArray;
@property (nonatomic, retain) AppRecord *workingEntry;
@property (nonatomic, retain) NSMutableString *workingPropertyString;
@property (nonatomic, retain) NSArray *elementsToParse;
@property (nonatomic, assign) BOOL storingCharacterData;
@end
@implementation ParseOperation
@synthesize delegate, dataToParse, workingArray, workingEntry, workingPropertyString, elementsToParse, storingCharacterData;
現在我知道這是不是C++和我們不應該假定在Objective C中應該遵守所有的C++實踐目標C應該有充分的理由偏離一般編程實踐。
- 爲什麼全部是私人ivars合成?從整個項目來看,外部課程只使用
NSMutableArray *workingArray
。所以其他的ivars都不應該有setter和getters。 - 爲什麼非常敏感的ivars合成?首先,現在
id delegate
有一個setter,這個對象的用戶可以在XML解析中間切換委託,這是沒有意義的。另外,NSData *dataToParse
是從網絡檢索到的原始XML數據。既然它有一個setter,這個對象的用戶可能會破壞數據。 - 什麼是標誌着包頭一切
private
的地步?因爲所有的ivars都被合成爲具有getter/setter,所以它們是公開的。你可以將它們設置爲任何你想要的,並且你可以隨時獲得它們的價值。
昨天有一些類似的問題:[公開閱讀,私人保留](http://stackoverflow.com/questions/5788458/public-read-private-retain-property); [私人@property創建一個私人ivar?](http://stackoverflow.com/questions/5784875/does-a-private-property-create-an-private-instance-variable)我不確定是否他們雖然回答你的問題。 – 2011-04-27 17:10:21
您可能也有興趣:[iOS:必須每個iVar真的是屬性?](http://stackoverflow.com/questions/5031230/ios-must-every-ivar-really-be-property) – 2011-04-27 19:56:38