Tho*_*mas 15 synthesizer objective-c
我试图理解synthesize具有属性名称覆盖的指令的目的.假设我有一个接口定义如下:
@interface Dummy ... {
UILabel *_dummyLabel;
}
@property (retain, nonatomic) UILabel *dummyLabel;
Run Code Online (Sandbox Code Playgroud)
在实现文件中,我有:
@synthesize dummyLabel = _dummyLabel;
Run Code Online (Sandbox Code Playgroud)
据我所知,"dummyLabel"只是实例变量"_dummyLabel"的别名.self._dummyLabel和self.dummyLabel之间有什么区别吗?
Jac*_*kin 24
是.self._dummyLabel是不确定的,但_dummyLabel不是.
Dot语法扩展为简单的方法调用,因此它不是特定于属性.如果你有一个被调用的方法-(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
Run Code Online (Sandbox Code Playgroud)
小智 17
你的理解是不正确的.dummyLabel是属性的名称,并且不是实例变量的别名 - 仅调用实例变量_dummyLabel.因此,以下适用于Dummy被调用的实例myObject:
[myObject dummyLabel] 作品myObject.dummyLabel 作品[myObject _dummyLabel] 失败myObject._dummyLabel 失败myObject->dummyLabel 失败myObject->_dummyLabel取决于伊娃的可见性(@public,@private,@protected)[myObject valueForKey: @"dummyLabel"] 作品[myObject valueForKey: @"_dummyLabel"]取决于实现+accessInstanceVariablesDirectly(即它将在+accessInstanceVariablesDirectly返回的默认情况下工作YES).Dev*_*hen 13
使用ivar的另一个名称而不是属性的优点是,当您访问其中一个或另一个时,您可以在代码中轻松查看 - Andre K
我无法找到"评论"按钮,因此我不得不将其作为"回答"发布.
只是想扩展Andre的评论 - 通过知道何时使用合成属性vs vanilla变量,你知道(特别是在setter的情况下)当一个变量被自动保留/复制/释放时,由于你很好的setter,而不是手工操纵.
当然,如果你做得对,你可能不需要setter的帮助来正确保留/释放对象!但是也可能有其他场景引用你的ivars self.ivar而不是_ivar可能有用,例如当你使用自定义setter/getter而不是默认的合成者时.也许每次修改属性时,您还希望将其存储到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
Run Code Online (Sandbox Code Playgroud)
注意:这只是说明性代码,可能有一千个问题!
所以现在,在你的代码中,如果你有一行说_autoLoginOn = YES- 你知道它不会被保存到NSUserDefaults,而如果你使用self.autoLoginOn = YES你就知道将要发生什么.
_autoLoginOn和之间的区别self.autoLoginOn不仅仅是语义.
| 归档时间: |
|
| 查看次数: |
15273 次 |
| 最近记录: |