题
我想了解的目的 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
.以下列举的实例 Dummy
叫 myObject
:
[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)初始化时,强烈建议只。
最后一段:
您应该总是直接从内部访问实例变量 一个初始化方法,因为,此时的属性设置,则 该对象的其余部分可能还没有完全被初始化。即使你 不提供自定义的访问方法或知道任何副作用 你自己的类中,未来的子类可以很好地覆盖 行为。