0

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

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

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

4

4 回答 4

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。

于 2013-04-10T17:48:36.317 回答
1

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

如果你不覆盖自动,synthesize那么你需要使用_propertyor self.property

在您的情况下,您似乎正在使用旧编译器(即 XCode4.3 bacwards 附带),或者您已将自动合成覆盖为:

@synthesize aCoder;
于 2013-04-10T17:19:34.613 回答
1

我假设你的意思是这个警告:

在此处输入图像描述

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

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

于 2013-04-10T17:30:49.467 回答
0

如果您在一个类中定义属性并且@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如果属性是在父类中定义的,您将无法使用。您必须在当前课程中进行综合才能使用它。

于 2013-04-10T18:20:35.457 回答