在阅读初学者的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