在Objective-C中消除歧义参数名称与实例variables名称的好习惯

我在Objective-C中遇到了一个相当常见的情况,在这里我将一个variables传递给一个init方法,然后将其分配给一个同名的实例variables。 不过,我还没有find一种方法来确定variables的范围,以明确哪些是来自消息参数的值,哪些是实例variables。

说我有一些类如下:

@interface MyObject { NSString *value; } - (id)initWithValue:(NSString *)value; @end 

在我的实现中,我希望我的init方法看起来像这样:

 - (id)initWithValue:(NSString *)value { self = [super init]; if(self) { self.value = value; // This will not work with instance variables } } 

我知道三个解决scheme:

  1. 创build一个允许调用self.value的属性
  2. 重命名我的实例variables,如_value
  3. 重命名我的init参数variables,如initValueargValue

我不满意这些解决scheme。 添加属性可以使该属性在接口上公开,或者如果我使用扩展名,则将其从inheritance者隐藏。 我也不喜欢为variables使用不同的名称,或者使用下划线,这可能来自其他语言(如Java和C#)的开发。

有没有办法从消息参数中消除实例variables的歧义? 如果没有,Cocoa有没有一个编码准​​则来解决这个问题? 在适当的时候,我喜欢下面的风格指导

更新

在思考如何在C中做到这一点后,我提出了self->value的解决scheme。 这是有效的,但是它产生了一个编译器警告: “值”本地声明隐藏了实例variables。 所以这不是一个令人满意的解决scheme,因为我有一个零警告的目标。

对于setter(以及通过扩展初始值设定项),我相信约定是在参数名称的前面加上new

 - (void)setCrunk:(Crunk *)newCrunk; - (id)initWithCrunk:(Crunk *)newCrunk; 

总的来说,我认为我见过的最常见的forms是调用参数theCrunk ,但是苹果似乎推荐了一个“ aCrunk

并将名称更改为“inValue”不是一个好主意? 你在这里有什么 – 你的“解决scheme”是复杂的,特别是Obj-C 2的访问器等。由于self.value和inValue是不同的东西,它们需要不同的名称。

请注意,您可以使用

 -(void)method1:(NSString*)value; 

在标题中

 -(void)method1:(NSString*)inValue; 

在.m文件中。

如果你只使用1,编译器会给你一个警告。

你可以结合使用1和2:

 @synthesize value = _value; 

如果你想从inheritance者隐藏你的variables,你可以声明一个空的命名类别并在那里声明你的属性。

对于3,你可以使用一个值作为你的参数。