下面是一个代码示例,它让我有些痛苦,并想知道是否有人可以提供帮助。我想在构造函数中设置类'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
}
答案 0 :(得分:3)
- (NSString *)version {
@synchronized(self) {
if (_version == nil) {
// some computation to work out version
_version = //result of computation
}
}
return _version;
}
第一次拨打[self version]
(在init
中)时,retVersion
为nil
,因此会执行计算。每次之后,它都是非零的并且是静态的,所以你只需返回第一次计算的结果。
如果需要,您可以从其他方法(此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;