【问题标题】:Objective C _underscore vs self.variableObjective C _underscore vs self.variable
【发布时间】:2017-01-24 18:53:02
【问题描述】:

我知道之前有人问过这个问题,但可能不是在相同的上下文中。我的问题是我有一个单例类,它在应用程序的生命周期中只有 dipatched_once。在类中,我有一些方法正在访问实例变量并在它们已在实例上设置时对其进行操作。这是我如何尝试访问它们的示例:

// .m 文件:

界面:

@property (nonatomic, assign, readwrite) BOOL userLoggedIn;

实施: // 方法:

-(void)someMethod{
    if(!_userLoggedIn){
    } 
    else {
    }
}

我知道我也可以像这样使用 self 来评估值:

-(void)someMethod{
    if(self.userLoggedIn){
    } 
    else {
    }
}

想知道访问值的正确方法是什么?我没有综合属性,因为它们都在接口中声明,仅在 .m 文件中。谢谢您的帮助!

【问题讨论】:

  • 视情况而定,但如果您实施了-(BOOL)userLoggedIn{},则可能会改变行为。
  • 如果userLoggedIn 仅定义为在实现中使用并且您正在使用对变量的直接访问,那么您是否有理由声明一个属性?为什么不直接使用实例变量(如@implementation { BOOL userLoggedIn; } ...?

标签: objective-c


【解决方案1】:

视情况而定。

您是否要调用访问器? _variable 是直接访问。 self.variable 调用-variable,由编译器自动合成。

前者在值变化时不会触发KVO。后者可以。这可能是一个特征或反特征。

但是,无论您选择哪种方式,尤其是对于写入操作,请使其保持一致,否则您将在未来追踪错误。


一般规则:

  • 直接在-init/-dealloc中访问

  • 在其他任何地方通过 setter/getter(点语法)访问


另请注意,直接访问不会尊重atomic

【讨论】:

  • 非常感谢!
  • 调用或不调用变量是什么意思?
  • @randomorb2110 _variable = 10; 直接设置实例变量。 self.variable = 10; 转换为 [self setVariable:10];。一种是直接写,一种是调用setter方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-28
相关资源
最近更新 更多