2013-12-18 23 views
0

下面是一个代码示例,它引起了一些痛苦,并想知道是否有人可以提供帮助。我想在构造函数中设置类的'版本'属性,因为它使用了很多处理(所以不想在每次另一个类获得属性时重新计算它)。命名返回属性值的私有方法

如果我正确地命名该方法(未暴露给其他类),我将其称为- (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

'[self computedVersion]'? –

+0

'版本'是一个公共属性? – nhgrif

+0

我认为如果你调用'permformSelector:@selector(getVersion)'方法将会被调用...... – Francesco

回答

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

PS:你也可以使用内部属性变量_version而不是依靠单独的静态变量。 – Kalyan02

+0

@Kalyan是的,谢谢 – nhgrif

+0

你也可以使用'dispatch_once'代码... – Francesco

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; 
+0

使用下划线作为前缀而不是后援名称的后缀。除了其他事项之外,不遵守约定会破坏KVC的兼容性。 – jlehr

+0

@jlehr它违背了约定,但是它是一个定制的例子 – Kalyan02

+0

那么为什么要提供一个违反苹果公司针对ivars的命名惯例的例子,这可能会导致问题?另外,你的setter方法是错误的 - 它应该是'setVersion:',而不是'version:'。请更新您的答案。 – jlehr