为什么在没有自己的情况下访问属性时有时只会出现编译错误?

时间:2013-04-10 17:16:55

标签: objective-c compiler-errors declared-property

我注意到在一些旧版本的Xcode中你可以使用没有self的对象属性。 现在,当我尝试在没有self的情况下访问我的属性时,它会给我一个错误,但今天我正在编写此代码,它工作正常,并没有给我任何错误。

[aCoder encodeObject:itemName forKey:@"itemName"];

为什么会这样?为什么我在这种情况下不会收到错误?为什么在其他情况下会出错?为什么不能统一这种行为,我应该使用什么?

4 个答案:

答案 0 :(得分:3)

您无法在没有self的情况下访问属性。如果您未使用self,则直接访问与该属性同名的实例变量。这给许多开发者带来了无穷无尽的问题。

这就是为什么最新的编译器(在最新版本的Xcode中)生成带有前导下划线的属性ivars。这样,如果您在尝试访问该属性时忘记使用self,则会收到错误,因为没有相同名称的ivar。

为了统一您的体验,您应该使用以下模式与较旧的编译器:

定义@property int foo;。然后定义ivar int _foo。然后使用@synthesize foo = _foo;

使用较新的编译器,您只需声明@property int foo即可完成。编译器将为您生成ivar int _foo

在这两种情况下,您都使用self.foo作为属性,_foo直接访问ivar。

答案 1 :(得分:1)

每当使用新LLVM编译器创建属性时,它都会创建一个名为_property的ivar。

如果您没有覆盖自动{ - 1}} d,则需要使用synthesize_property

在你的情况下,看起来你正在使用旧的编译器(即带有XCode4.3 bacwards)或者你已经过度自动合成为:

self.property

答案 2 :(得分:1)

我认为你的意思是这个警告:

enter image description here

许多项目在其构建设置中未启用许多警告,因此这可能是您没有看到此警告的一个原因。

还有一些方法可以直接访问实例变量,Xcode会忽略直接的ivar访问;这些方法包括init*dealloc方法(但遗憾的是不是getter / setter方法)。

答案 3 :(得分:0)

如果你在一个类中定义属性并且@synthesize它们使用相同的命名,那么你可以不用自己访问它们

e.g。

在.h

@property(nonatomic, copy) NSString *str1;

在.m

@synthesize str1 = str1;

str1 = @"hello";
self.str1 = @"hello"; // Or this

如果您不使用显式@synthesize,那么XCode会自动执行@synthesize property = _property(从最近开始),以便您可以执行以下操作

在.h

@property(nonatomic, copy) NSString *str1;

在.m

_str1 = @"hello";
self._str1 = @"hello"; // Or this

如果属性是在父类中定义的,则无法使用self。您必须在当前课程中进行综合才能使用它。