在具有合成属性的setter中命名形式参数

时间:2014-01-10 20:49:30

标签: objective-c naming-conventions

我一直在学习和使用Objective-C已经有一段时间了(它也是我的第一个OOP语言),我终于想知道如何正确命名合成属性。

让我们采取以下方案:

我有一个名为someVariable的属性。

@property (nonatomic, retain) NSString *someVariable;

并合成它

@synthesize someVariable;

自定义设置器的外观如何?


1)

我会继续说出类似

的内容
-(void)setSomeVariable:(NSString *)someVar{

    //input parameter MAY sound/look foreign due to the difference to the property
    someVariable = someVar;

}

2)(非法)

但是为了便于阅读和方便,我想将正式参数命名为属性。更喜欢像这样的Java:

-(void)setSomeVariable:(NSString *)someVariable{

    //obviously illegal because this would call the setter over and over again
    self.someVariable = someVariable; 

}

3)(非常规)

根据我过去读过的内容

@synthesize someVariable = _someVariable; 

据说是非常规的,不应该被使用。


那么,我是否正确地得出结论,直到现在我一直这样做,是创建自定义setter的唯一方法?

1 个答案:

答案 0 :(得分:3)

3)不是非常规的,如果你不提供@synthesize语句,它正是编译器所做的。

这意味着,如果没有@synthesize语句和ivar声明,您有一个名为_someVariable的隐式ivar,而自定义setter通常会有一个名为someVariable的参数

-(void)setSomeVariable:(NSString *)someVariable {
    _someVariable = someVariable;
}

另请注意,为特定属性提供自定义setter getter方法表示Xcode编译器不提供隐式ivar(此处为_someVariable)。在readonly属性的情况下,如果只提供getter方法,则为true。

WWDC 2012 session 405提供了有关现代版本编译器的Objective-C构造的大量细节。

修改

正如H2CO3在他的回答中所建议的那样,我写的代码假设你正在使用ARC。如果您使用的是MRC,则setter方法更适合:

-(void)setSomeVariable:(NSString *)someVariable {
    [someVariable retain];
    [_someVariable release];
    _someVariable = someVariable;
}