9

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

例如,

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

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

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

4

2 回答 2

13

您可能可以执行类似的操作self->object = object,但 Objective-C 约定(源自 Smalltalk)是在参数与实例变量同名的情况下为参数添加前缀“a”或“an”。

于 2009-08-11T02:50:29.083 回答
8

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

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

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

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

@implementation AClass
@synthesize object = _object;

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

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

于 2009-08-11T03:04:16.563 回答