在 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
最佳答案
您实际上并没有定义变量,您只定义了一个属性(它隐式定义了一个私有(private)变量)。由于属性只是方法,因此您需要点语法。请注意,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
编辑: 提到合成实例变量默认是私有(private)的,如@Jason Coco 所述。 @NSGod 是对的,普通实例变量默认是 protected 而不是 public,修复了这个问题。
关于objective-c - 在 Objective-c 中继承实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8511949/