【发布时间】:2012-01-05 18:08:12
【问题描述】:
我在 Objective-C 中遇到了一个相当常见的场景,我将一个变量传递给一个 init 方法,然后想将它分配给一个同名的实例变量。但是,我还没有找到一种方法来确定变量范围以阐明哪个是消息参数的值,哪个是实例变量。
假设我有一些课程,如下所示:
@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
}
}
我知道三种解决方案:
- 创建一个属性,允许调用
self.value - 重命名我的实例变量,如
_value - 重命名我的初始化参数变量,例如
initValue或argValue
我对这些解决方案都不满意。添加属性或者使该属性在接口上公开可用,或者,如果我使用扩展,则将其对继承者隐藏。我也不喜欢为变量使用不同的名称或使用下划线,这可能来自于使用其他语言(如 Java 和 C#)进行开发。
有没有办法从消息参数中消除实例变量的歧义?如果没有,Cocoa 中是否有关于如何解决此问题的编码指南?我喜欢在适当的时候遵循风格指南。
更新
在考虑了如何在 C 中做到这一点后,我想出了self->value 的解决方案。这可行,但它会产生一个编译器警告,即 'value' 的本地声明隐藏了实例变量。所以这也不是一个令人满意的解决方案,因为我的目标是零警告。
【问题讨论】:
标签: iphone objective-c ios cocoa