Objective c 为什么编译器在类扩展中需要实例变量访问而不是属性访问?
Xcode中的编译器要求我使用类扩展中声明的属性的实例变量名Objective c 为什么编译器在类扩展中需要实例变量访问而不是属性访问?,objective-c,xcode,Objective C,Xcode,Xcode中的编译器要求我使用类扩展中声明的属性的实例变量名 @interface Person () @property NSString *bar @end @implementation Person -(void) foo { NSString *foo = _bar; // underscore required here } @end 在上面的代码示例中,为什么我不能在没有下划线的情况下访问bar?您可以作为self.bar访问bar,它比\u bar更可取\u条
@interface Person ()
@property NSString *bar
@end
@implementation Person
-(void) foo {
NSString *foo = _bar; // underscore required here
}
@end
在上面的代码示例中,为什么我不能在没有下划线的情况下访问bar?您可以作为
self.bar
访问bar
,它比\u bar
更可取<代码>\u条可用于旧代码
看起来你是从Swift来到Objective-C的,编译器会自动为你添加
self.
。因为你还没有合成它。我的印象是,属性是由编译器自动合成的,就像它们在.h的接口中声明时一样。这是不对的吗@RahulAlso\u bar
是一个ivar,它是在您使用@property
声明时创建的。但是synthesis会执行此映射。@synthesis undoManager=\u undoManager
条是一个属性,而不是一个实例变量。如果您想访问它,请使用:self.bar。是的,有自动合成,这意味着编译器会为您创建一个名为_bar的实例变量来存储您的属性。是的,您可以直接访问它。@Rahul的初始注释不正确@奥尼克的评论是正确的。本例中的属性是自动合成的,可以使用\u bar
直接访问,也可以通过属性getter作为self.bar
访问。为什么.h接口中声明的属性不需要self,而Xcode不强制访问实例变量?这与类扩展中的属性有关吗?更正:直接访问ivar不适用于遗留代码,事实上,self.bar
和\u bar
都是有效的,因为@property
已经存在。有时,您可能希望直接访问底层变量,而不必通过self.bar
@lostatsea调用的getter或setter函数。区别在于直接访问变量或通过getter或setter方法访问变量。两者在Objective-C中都有效。在Swift中,这种区别不再存在。@Dima,您不应该直接使用ivars。在多线程应用程序中,直接访问IVAR是不安全的。这就是为什么斯威夫特不允许这样做。@Dima谢谢你的澄清!很容易找到一个快速到Objective-C的程序员哈哈。