有没有办法在不隐藏该变量的情况下为与Objective-C中的实例变量同名的方法提供参数?
例如,
- (void)doSomething:(id)object
{
self.object = object;
}
上面的代码给出了警告“对象'的本地声明隐藏了实例变量。”
显而易见的解决方案是以不同方式命名参数参数,但我发现选择“anObject”而不是“object”这样的名称很烦人。
答案 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”一样令人反感。重命名是最佳解决方案,因为实例和局部变量具有不同的角色,它们的名称应该反映这一点。