Objective-C合成属性名称覆盖

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不仅仅是语义.