有没有办法在不隐藏该变量的情况下为与Objective-C中的实例变量同名的方法提供参数?
例如,
- (void)doSomething:(id)object { self.object = object; }
上面的代码给出了警告"对象'的本地声明隐藏实例变量."
显而易见的解决方案是以不同的方式命名参数参数,但我发现选择像"anObject"而不是"object"这样的名称很烦人.
您可能能够执行类似的操作self->object = object
,但Objective-C约定(源自Smalltalk)是使用"a"或"an"为参数添加前缀(如果参数与实例变量具有相同名称).
您可以使用点表示法来访问属性(如示例中所示),但实例变量只有一个访问路径,因此,如果要同时访问实例变量和局部变量,唯一的解决方案是为它们指定不同的名称.
从形式上讲,这与lambda演算中alpha转换的限制有关,特别是绑定变量应保持绑定且自由变量保持空闲.
如果您不喜欢本地的"an"前缀,则可以对实例变量使用"_"前缀约定,因为它们也是有效保护的变量.
@interface AClass { id _object; } @property (retain) id object; @end @implementation AClass @synthesize object = _object; - (void)doSomething:(id)object { [_object befriend:object]; } ...
当然,"_"读作"我的",因此它可能与参数之前的"a"/"an"一样令人反感.重命名是最佳解决方案,因为实例和局部变量具有不同的角色,它们的名称应该反映这一点.