我注意到在一些旧版本的 Xcode 中,你可以使用对象的属性而不是self
很好。现在,当我尝试在没有 的情况下访问我的属性时,它给了我一个错误self
,但是今天我正在编写这段代码,它工作正常,并且没有给我任何错误。
[aCoder encodeObject:itemName forKey:@"itemName"];
为什么会这样?为什么在这种情况下我不会收到错误消息?为什么在其他情况下会引发错误?为什么不能统一这种行为,应该怎么用?
我注意到在一些旧版本的 Xcode 中,你可以使用对象的属性而不是self
很好。现在,当我尝试在没有 的情况下访问我的属性时,它给了我一个错误self
,但是今天我正在编写这段代码,它工作正常,并且没有给我任何错误。
[aCoder encodeObject:itemName forKey:@"itemName"];
为什么会这样?为什么在这种情况下我不会收到错误消息?为什么在其他情况下会引发错误?为什么不能统一这种行为,应该怎么用?
没有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。
每当您使用新的 LLVM 编译器创建属性时,它都会创建一个名为_property
.
如果你不覆盖自动,synthesize
那么你需要使用_property
or self.property
。
在您的情况下,您似乎正在使用旧编译器(即 XCode4.3 bacwards 附带),或者您已将自动合成覆盖为:
@synthesize aCoder;
我假设你的意思是这个警告:
许多项目在其构建设置中没有启用许多警告,因此这可能是您没有看到此警告的原因之一。
还有一些方法是常见的直接访问实例变量,Xcode会忽略直接的ivar访问;这些包括init*
anddealloc
方法(但不幸的是不是 getter/setter 方法)。
如果您在一个类中定义属性并且@synthesize
它们使用相同的命名,那么您可以在没有 self 的情况下访问它们
例如
在.h
@property(nonatomic, copy) NSString *str1;
在.m
@synthesize str1 = str1;
str1 = @"hello";
self.str1 = @"hello"; // Or this
如果您不使用 explicit @synthesize
,那么 XCode 会自动执行@synthesize property = _property
(从最近开始),因此您可以执行以下操作
在.h
@property(nonatomic, copy) NSString *str1;
在.m
_str1 = @"hello";
self._str1 = @"hello"; // Or this
self
如果属性是在父类中定义的,您将无法使用。您必须在当前课程中进行综合才能使用它。