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