我注意到在一些旧版本的Xcode中你可以使用没有self
的对象属性。
现在,当我尝试在没有self
的情况下访问我的属性时,它会给我一个错误,但今天我正在编写此代码,它工作正常,并没有给我任何错误。
[aCoder encodeObject:itemName forKey:@"itemName"];
为什么会这样?为什么我在这种情况下不会收到错误?为什么在其他情况下会出错?为什么不能统一这种行为,我应该使用什么?
答案 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)
我认为你的意思是这个警告:
许多项目在其构建设置中未启用许多警告,因此这可能是您没有看到此警告的一个原因。
还有一些方法可以直接访问实例变量,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
。您必须在当前课程中进行综合才能使用它。