当前位置:  开发笔记 > 前端 > 正文

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

如何解决《参数隐藏Objective-C中的实例变量》经验,为你挑选了2个好方法。

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

例如,

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

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

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



1> mipadi..:

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


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

2> outis..:

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

从形式上讲,这与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"一样令人反感.重命名是最佳解决方案,因为实例和局部变量具有不同的角色,它们的名称应该反映这一点.


实际上,您可以使用self-> object访问ivars.此外,Apple"保留"自己使用的下划线前缀,尽管似乎没有人注意到这一点.就个人而言,我使用i_作为我的ivars的前缀,这也有助于将它们与属性区分开来.
@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)我个人不会为实例变量添加前缀根本不是改变方法参数的名称.
推荐阅读
ERIK又
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有