参数隐藏Objective-C中的实例变量

时间:2009-08-11 02:46:47

标签: objective-c hidden-variables

有没有办法在不隐藏该变量的情况下为与Objective-C中的实例变量同名的方法提供参数?

例如,

- (void)doSomething:(id)object
{
    self.object = object;
}

上面的代码给出了警告“对象'的本地声明隐藏了实例变量。”

显而易见的解决方案是以不同方式命名参数参数,但我发现选择“anObject”而不是“object”这样的名称很烦人。

2 个答案:

答案 0 :(得分:13)

您可以执行self->object = object之类的操作,但Objective-C约定(源自Smalltalk)是使用“a”或“an”为参数添加前缀(如果参数与实例具有相同名称)变量

答案 1 :(得分:8)

您可以使用点表示法来访问属性(如示例中所示),但实例变量只有一个访问路径,因此,如果要同时访问实例变量和局部变量,唯一的解决方案就是给它们不同的名字。

从形式上讲,这与lambda演算中对alpha conversion的限制有关,特别是绑定变量应保持绑定且自由变量保持空闲。

如果您不喜欢本地的“an”前缀,则可以对实例变量使用“_”前缀约定,因为它们也是有效保护的变量。

@interface AClass {
    id _object;
}
@property (retain) id object;
@end

@implementation AClass
@synthesize object = _object;

- (void)doSomething:(id)object
{
    [_object befriend:object];
}
...

当然,“_”读作“我的”,因此它可能与参数之前的“a”/“an”一样令人反感。重命名是最佳解决方案,因为实例和局部变量具有不同的角色,它们的名称应该反映这一点。