是否建议为只读合成属性定义ivars?
我已经发现很多时候我想拥有一个综合只读属性,我只是用其他变量来实现该属性的getter方法,而不需要一个ivar,例如(注意 :我定义的ivars的接口,因为我使用的OmniGraffle UML软件,它不承认的ivars通过合成特性自动生成):是否建议为只读合成属性定义ivars?
@interface Editor : UIView {
BOOL _wordWrap;
BOOL _showLineNumbers;
NSDictionary *_options;
}
@property (nonatomic) BOOL wordWrap;
@property (nonatomic) BOOL showLineNumbers;
@property (nonatomic, copy, readonly) NSDictionary *options;
@end
@implementation Editor
@synthesize wordWrap = _wordWrap;
@synthesize showLineNumbers = _showLineNumbers;
@synthesize options = _options;
- (NSDictionary *)options {
return @{
@"WordWrap" : [NSNumber numberWithBool:self.wordWrap],
@"ShowLineNumbers" : [NSNumber numberWithBool:self.showLineNumbers],
};
}
@end
在上面Editor
类,是我有必要在头文件定义中定义_options
ivar并且更多重要的是自动生成的ivar占用符号表中的内存或空间吗?另外,在这种情况下使用copy
,retain
还是没有值会更有效率?只是好奇。
第一:停止将您的伊娃尔宣言放入您的@interface
。他们属于你的@implementation
。有关详细说明,请参见this answer。
无论如何,鉴于你所写的,你的@synthesize options = _options
没有任何效果。
这@synthesize
有两个可能的影响:
它增加了一个名为
_options
的实例变量,如果你的类没有一个。它生成一个getter方法
options
,如果您的类没有名为options
的方法,则返回值为_options
。
由于您手动定义了实例变量和获取方,所以@synthesize
什么都不做。您可以完全删除它,而无需更改程序的含义。
在readonly属性上指定copy
不起作用。 copy
和retain
(或更合适的ARC,strong
)属性仅影响生成的setter方法,编译器不会为readonly
属性生成setter。 (如果您更改属性readwrite
在类扩展,然后copy
事项。)
是的,_options
伊娃占用两个内存(为Editor
每个实例)和空间的符号表。 既然你没有使用伊娃尔_options
,你应该完全删除它。你也应该完全删除@synthesize
,所以编译器不会为你生成ivar。
我写的ivars,因为我使用OmniGiraffe生成UML的 –
不过它消耗内存。 –
我仍然可以通过使用self.options访问该属性? –
你为什么明确定义和综合ivars呢? – vikingosegundo
并且你还没有使用ARC? – vikingosegundo
@vikingosegundo我知道编译器会自动生成ivars,但我使用的是UML软件(OmniGiraffe),它似乎无法处理合成属性所产生的ivars。是的,我正在使用ARC。在我的代码中有什么东西使得它看起来像我没有使用ARC? –