在
Objective-c 2.0中为什么子类需要使用self关键字引用父类中的实例变量?
考虑这个例子:
// a.h @interface MyClass : NSObject @property (nonatomic,retain) Object *myObject; @end // a.m @implementation MyClass @synthesize myObject; @end // b.h @interface AnotherClass : MyClass @end // b.m @implementation AnotherClass - (void) someMethod { // error // Object *obj = myObject; // works // Object *obj = self.myObject; } @end
解决方法
您实际上没有定义一个变量,您只定义了一个属性(隐式定义了一个非私有变量).由于属性只是方法,您需要点语法.请注意,self.property与[self property]相同.
要解决这个问题,请指定一个变量.我会给你一个例子,其中变量的名称与属性不同.大多数人都选择了同一个名字,但我喜欢让他们有所不同,所以我马上看到哪一个是意思.
// a.h @interface MyClass : NSObject { // Instance variables are "protected" by default,except if you // use @private or @public. Object *myObjectVar; } @property (nonatomic,retain) Object *myObject; @end // a.m @implementation MyClass @synthesize myObject = myObjectVar; @end // b.h @interface AnotherClass : MyClass @end // b.m @implementation AnotherClass - (void) someMethod { // works Object *obj = myObjectVar; // works obj = self.myObject; // the same as self.myObject obj = [self myObject]; } @end
注意分配时的区别:如果分配给变量,对象不会自动保留.但是如果您使用该属性,它将被保留:
myObjectVar = someObject; // not retained,old object not released! self.myObject = someObject; // old object released,new object retained [self setMyObject:someObject]; // same as the line above
编辑:提到合成的实例变量默认是私有的,如@Jason Coco所指出的.而@NSGod是正确的,正常的实例变量是默认而不是公共的,固定的.