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

tit*_*coy 9 objective-c hidden-variables

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

例如,

- (void)doSomething:(id)object
{
    self.object = object;
}
Run Code Online (Sandbox Code Playgroud)

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

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

mip*_*adi 13

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

  • 这个答案+1.公共Cocoa API使用诸如"anObject"和"aDictionary"之类的参数名来区分实例变量.除了遵循惯例之外,这使得它不太可能意外地引用错误的变量,并且更容易重构. (2认同)

out*_*tis 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];
}
...
Run Code Online (Sandbox Code Playgroud)

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

  • 实际上,您可以使用self-> object访问ivars.此外,Apple"保留"自己使用的下划线前缀,尽管似乎没有人注意到这一点.就个人而言,我使用i_作为我的ivars的前缀,这也有助于将它们与属性区分开来. (2认同)
  • @Peter:实际上,"Apple保留的下划线"仅指Apple的内部代码库.对于您自己的代码,您可以自由使用下划线前缀变量名称,Apple实际上提到下划线前缀可用于表示实例_变量及其访问器方法self.variable之间的差异.(请参阅https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingIvarsAndTypes.html#//apple_ref/doc/uid/20001284-BAJGIIJE)我个人不会为实例变量添加前缀根本不是改变方法参数的名称. (2认同)