gpt4 book ai didi

objective-c - 在 Objective-c 中继承实例变量

转载 作者:太空狗 更新时间:2023-10-30 03:23:34 24 4
gpt4 key购买 nike

在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com