为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

iOS
函数式编程 2019-06-05 15:07:22
objective-c类中变量前面的下划线是如何工作的?我在一些iPhone示例中看到,属性在变量前面使用了下划线_in。有人知道这意味着什么吗?或者它是如何工作的?我使用的接口文件如下所示:@interface MissionCell : UITableViewCell {     Mission *_mission;     UILabel *_missionName;}@property (nonatomic, retain) UILabel *missionName;- (Mission *)mission;我不知道上面的内容到底是什么,但当我试图设置任务名称时,如下所示:aMission.missionName = missionName;我知道错误:在非结构或联盟中请求成员“使徒名称”
查看完整描述

3 回答

?
RISEBY

TA贡献1856条经验 获得超5个赞

如果您为您的IVAR使用下划线前缀(这只不过是一个通用约定,但很有用),那么您需要多做一件事情,以便自动生成的访问器(用于属性)知道要使用哪个IVAR。具体来说,在您的实现文件中,synthesize应该是这样的:

@synthesize missionName = _missionName;

更笼统地说,这是:

@synthesize propertyName = _ivarName;


查看完整回答
反对 回复 2019-06-05
?
茅侃侃

TA贡献1842条经验 获得超21个赞

这只是一个可读性的惯例,它对编译器没有什么特别的作用。您将看到人们在私有实例变量和方法名称上使用它。实际上,苹果建议不要使用下划线(如果你不小心,你可以在超类中覆盖一些东西),但是你不应该因为忽视这个建议而感到难过。*)


查看完整回答
反对 回复 2019-06-05
?
缥缈止盈

TA贡献2041条经验 获得超4个赞

我看到的唯一有用的目的是像上面提到的那样区分局部变量和成员变量,但这不是一个必要的约定。当与@属性配对时,它会增加合成语句的详细性-@synthesize missionName = _missionName;到处都很丑。

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

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

编辑:有了自动合成的最新编译器特性,我现在用下划线来表示IVAR(在非常罕见的情况下,我需要使用IVAR来匹配自动合成所做的事情)。


查看完整回答
反对 回复 2019-06-05
  • 3 回答
  • 0 关注
  • 782 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信