2

我发现很多时候我想要一个综合的只读属性,我只是根据其他变量来实现该属性的 getter 方法,而不需要 ivar,例如(注意:我正在定义界面中的 ivars,因为我使用的是 OmniGraffle UML 软件,它无法识别由合成属性自动生成的 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或 no value会更有效吗?只是好奇。

4

1 回答 1

4

首先:停止将您的 ivar 声明放入您的@interface. 它们属于您的@implementation. 有关详细说明,请参阅此答案

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

@synthesize有两个可能的影响:

  1. _options如果您的类没有实例变量,它会添加一个名为 的实例变量。

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

由于您手动定义了实例变量和 getter,因此@synthesize什么也不做。您可以完全删除它而不改变程序的含义。

在只读属性上指定copy无效。copyand retain(或者,在 ARC 下更准确地说,)strong属性只影响生成的 setter 方法,编译器不会为readonly属性生成 setter。(如果您将属性更改为readwrite在类扩展中,那么copy很重要。)

是的,_optionsivar 占用了Editor符号表中的内存(对于 的每个实例)和空间。由于您没有使用_optionsivar,因此您应该完全删除它。您还应该@synthesize完全删除,因此编译器不会_options为您生成 ivar。

于 2014-07-09T20:30:31.983 回答