命名返回属性值的私有方法

时间:2013-12-18 13:04:49

标签: objective-c class properties structure

下面是一个代码示例,它让我有些痛苦,并想知道是否有人可以提供帮助。我想在构造函数中设置类'version'属性,因为它耗尽了大量的处理(因此每次另一个类获取属性时都不想重新计算它)。

如果我正确地命名方法(没有暴露给其他类),我会称之为- (NSString *)version而不是getVersion。然而,它将成为这堂课的吸气剂。

所以我的问题是,下面的代码包含一个错误地使用术语'get'作为前缀的方法,但是如果我删除了get,那么内部方法突然变成了一个公共getter,我不想要它是。

有没有人知道避免这种情况的最佳做法?

#pragma mark Constructor

- (id)init
{
    self = [super init];
    if (self) {
        // Initialization code here
        self.version = [self getVersion];
    }    
    return self;
}

#pragma mark General

- (NSString *)getVersion
{
   // some computation to work out version
}

2 个答案:

答案 0 :(得分:3)

- (NSString *)version {
    @synchronized(self) {
        if (_version == nil) {
            // some computation to work out version
            _version = //result of computation
        }
    }
    return _version;
}

第一次拨打[self version](在init中)时,retVersionnil,因此会执行计算。每次之后,它都是非零的并且是静态的,所以你只需返回第一次计算的结果。

如果需要,您可以从其他方法(此getter之外)更改_version

答案 1 :(得分:1)

您可以以仅执行一次计算的方式覆盖默认的getter。 这样您就不需要在构造函数中进行赋值。

- (NSString *)version
{
    // check if internal variable has data, if not, do your thing
    if (!_version) {
        // perform your intensive version fetching operation 
        // and assign it to the internal variable of the property _version
        _version = [self versionImplementation];
    }
    // now just return it
    return _version;
}

内部变量也有助于设置者,例如在验证数据时

- (void)setVersion:(NSString *)newVersion
{
    if( newVersion > kSomeConstant )
    {
        _version = newVersion;
    }
}

合成属性时,会自动创建_version,以确保它存在。您还可以通过显式合成来自定义内部变量名称

@synthesize version = _myCustomVersionVariable;