是否建议为只读合成属性定义ivars?

是否建议为只读合成属性定义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还是没有值会更有效率?只是好奇。

+0

你为什么明确定义和综合ivars呢? – vikingosegundo

+1

并且你还没有使用ARC? – vikingosegundo

+0

@vikingosegundo我知道编译器会自动生成ivars,但我使用的是UML软件(OmniGiraffe),它似乎无法处理合成属性所产生的ivars。是的,我正在使用ARC。在我的代码中有什么东西使得它看起来像我没有使用ARC? –

第一:停止将您的伊娃尔宣言放入您的@interface。他们属于你的@implementation。有关详细说明,请参见this answer

无论如何,鉴于你所写的,你的@synthesize options = _options没有任何效果。

@synthesize有两个可能的影响:

  1. 它增加了一个名为_options的实例变量,如果你的类没有一个。

  2. 它生成一个getter方法options,如果您的类没有名为options的方法,则返回值为_options

由于您手动定义了实例变量和获取方,所以@synthesize什么都不做。您可以完全删除它,而无需更改程序的含义。

在readonly属性上指定copy不起作用。 copyretain(或更合适的ARC,strong)属性仅影响生成的setter方法,编译器不会为readonly属性生成setter。 (如果您更改属性readwrite在类扩展,然后copy事项。)

是的,_options伊娃占用两个内存(为Editor每个实例)和空间的符号表。 既然你没有使用伊娃尔_options,你应该完全删除它。你也应该完全删除@synthesize,所以编译器不会为你生成ivar。

+0

我写的ivars,因为我使用OmniGiraffe生成UML的 –

+0

不过它消耗内存。 –

+0

我仍然可以通过使用self.options访问该属性? –