Objective c 为什么编译器在类扩展中需要实例变量访问而不是属性访问?

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条

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条可用于旧代码


看起来你是从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的程序员哈哈。