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

在cocoa objective-c类中变量前面的下划线如何工作?

如何解决《在cocoaobjective-c类中变量前面的下划线如何工作?》经验,为你挑选了4个好方法。

我在一些iPhone示例中看到,属性在变量前面使用了下划线_.有谁知道这意味着什么?或者它是如何工作的?

我正在使用的接口文件如下所示:

@interface MissionCell : UITableViewCell {
    Mission *_mission;
    UILabel *_missionName;
}

@property (nonatomic, retain) UILabel *missionName;

- (Mission *)mission;

我不确定上面做了什么,但是当我尝试设置任务名称时:

aMission.missionName = missionName;

我收到错误:

请求成员'missionName'的东西不是结构或联合

Kelan.. 96

如果你的ivars使用下划线前缀(这只是一个常见的约定,但是很有用),那么你需要做一件额外的事情,这样自动生成的访问器(对于属性)知道要使用哪个ivar.具体来说,在您的实现文件中,您synthesize应该如下所示:

@synthesize missionName = _missionName;

更一般地说,这是:

@synthesize propertyName = _ivarName;

具有自动合成属性,不再需要.Xcode在后台合成了@property xxxx和名为_xxxx的ivar.整齐. (77认同)


Marc Charbon.. 18

它只是一个可读性的约定,它对编译器没有任何特殊之处.您会看到人们在私有实例变量和方法名称上使用它.Apple实际上建议不要使用下划线(如果你不小心你可以覆盖你的超类中的某些东西),但你不应该对忽略这个建议感到不好.:)



1> Kelan..:

如果你的ivars使用下划线前缀(这只是一个常见的约定,但是很有用),那么你需要做一件额外的事情,这样自动生成的访问器(对于属性)知道要使用哪个ivar.具体来说,在您的实现文件中,您synthesize应该如下所示:

@synthesize missionName = _missionName;

更一般地说,这是:

@synthesize propertyName = _ivarName;


具有自动合成属性,不再需要.Xcode在后台合成了@property xxxx和名为_xxxx的ivar.整齐.

2> Marc Charbon..:

它只是一个可读性的约定,它对编译器没有任何特殊之处.您会看到人们在私有实例变量和方法名称上使用它.Apple实际上建议不要使用下划线(如果你不小心你可以覆盖你的超类中的某些东西),但你不应该对忽略这个建议感到不好.:)


根据我的理解,Apple建议不要在方法名称上使用下划线前缀(它们将自己保留为私有方法的约定),但它们没有任何关于实例变量名称的建议.
@Kelan事实上,Apple [鼓励这样做](https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingIvarsAndTypes.html#//apple_ref/doc/uid/ 20001284-BAJGIIJE):"通常,您不应该直接访问实例变量,而是应该使用访问器方法(您可以直接在init和dealloc方法中访问实例变量).为了帮助发出信号,请使用下划线对实例变量名称进行前缀( _),例如:\ @implementation MyClass {BOOL _showsTitle;}"

3> Peter DeWees..:

我所看到的唯一有用的目的是区分局部变量和成员变量,如上所述,但它不是必要的约定.当与@property配对时,它会增加综合语句的冗长程度 - @synthesize missionName = _missionName;并且到处都是丑陋的.

而不是使用下划线,只需在不冲突的方法中使用描述性变量名称.当它们必须冲突时,方法中的变量名称应该使用下划线,而不是多个方法可能使用的成员变量.唯一有用的常见地方是setter或init方法.此外,它将使@synthesize语句更简洁.

-(void)setMyString:(NSString*)_myString
{
    myString = _myString;
}

编辑: 利用自动合成的最新编译器功能,我现在在ivar中使用下划线(在极少数情况下我需要使用ivar来匹配自动合成的功能.



4> smorgan..:

它并不意味着什么,它只是一些人用来区分成员变量和局部变量的约定.

至于错误,听起来像是一个错误的类型.它的宣言是什么?

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有