我想了解的目的 synthesize 指令与酒店的名字重写。说我有一个接口定义如下:

@interface Dummy ... {
    UILabel *_dummyLabel;
}

@property (retain, nonatomic) UILabel *dummyLabel;

并且在执行文件,我有:

@synthesize dummyLabel = _dummyLabel;

从什么我的理解是,"dummyLabel"只是一个别的实例可变"_dummyLabel".是否有任何差别的自我。_dummyLabel和自我。dummyLabel?

有帮助吗?

解决方案

是。 self._dummyLabel未定义,然而_dummyLabel不是

点语法膨胀出简单的方法调用,所以它不是专用于性能。如果你有一个称为-(id)someObject,例如在object.someObject的情况下的方法,这将是作为如果写下[object someObject];

self.dummyLabel  //works
self._dummyLabel //does not work
dummyLabel       //does not work
_dummyLabel      //works
[self dummyLabel];  //works
[self _dummyLabel]; //does not work

其他提示

您的理解是不正确的。 dummyLabel 是的名称性,并且是 别名的实例可变的实例是变量 _dummyLabel.以下列举的实例 DummymyObject:

  • [myObject dummyLabel] 工作
  • myObject.dummyLabel 工作
  • [myObject _dummyLabel] 失败
  • myObject._dummyLabel 失败
  • myObject->dummyLabel 失败
  • myObject->_dummyLabel 取决于可见度的ivar(@public, @private, @protected)
  • [myObject valueForKey: @"dummyLabel"] 工作
  • [myObject valueForKey: @"_dummyLabel"] 取决于执行情况 +accessInstanceVariablesDirectly (即它会在对默认的情况 +accessInstanceVariablesDirectly 返回 YES).
  

具有另一名称的优点   对伊娃比对财产   你可以在代码中很容易地看到   当你访问一个或   其他 - 安德烈ķ

我不能够找到一个“注释”按钮,所以我不得不张贴作为“答案”。

只是想在安德烈的评论扩大 - 通过了解,当您使用的是合成的性能相香草变量,你知道的(尤其是在制定者的情况下)当一个变量被保留/复制的/自动释放感谢你的好二传手,VS是由手操纵。

当然,如果你正在做正确的事情,你也许并不需要一个setter保留的帮助/释放正当理由反对!但可以有其他方案,其中也涉及到您的ivars作为self.ivar代替_ivar可以是有益的,例如,当您使用自定义设置器/吸气而不是默认的合成的。也许你每次修改属性的时候,你也想将其保存到NSUserDefaults的。所以,你可能有一些像这样的代码:

@interface SOUserSettings : NSObject {

BOOL _autoLoginOn;

}

@property (nonatomic, assign) BOOL autoLoginOn;

@end

@implementation SOUserSettings

@synthesize autoLoginOn = _autoLoginOn;

- (void)setAutoLoginOn:(BOOL)newAutoLoginOnValue {

   _autoLoginOn = newAutoLoginOnValue;
   [[NSUserDefaults standardUserDefaults] setBool:_autoLoginOn forKey:@"UserPrefAutoLoginOn"];
}

@end

请注意:这仅仅是说明性的代码,可能会有一千个东西错了,

所以,现在,在你的代码,如果你有这样一行_autoLoginOn = YES - 你知道它不会被保存到NSUserDefaults的,而如果你使用self.autoLoginOn = YES你确切地知道会发生什么

_autoLoginOn self.autoLoginOn之间的区别是不仅仅是语义。

  

我看不出有任何大的优势   重命名_dummyLabel到dummyLabel

在一些ObjC运行时将你有一个很难决策的实例变量无形的类的用户。对他们来说,你的实例变量坚持一些前缀(或后缀),可以把它清除(或更清晰),你不希望你的变量任何人搞乱。然而,你不希望你的公共职能是黏糊糊的。这可以让你得到它了。

它也如果你需要同时保持一个老接口与一组名称为新的API使用一组新的名称(setLastname与setSurname)是有用的。

老帖子,但我认为其重要提,它是通过getter和setter方法建议访问变量(所以,用点表示)。直接访问一个字段(_ivar)初始化时,强烈建议只。

有一些好苹果的文章: https://developer.apple.com/库/ IOS /#文档/可可/概念性/ ProgrammingWithObjectiveC / EncapsulatingData / EncapsulatingData.html

最后一段:

  

您应该总是直接从内部访问实例变量   一个初始化方法,因为,此时的属性设置,则   该对象的其余部分可能还没有完全被初始化。即使你   不提供自定义的访问方法或知道任何副作用   你自己的类中,未来的子类可以很好地覆盖   行为。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top