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

标签 objective-c inheritance instance-variables self

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

相关文章:

java - 如何从静态 Main 方法访问当前实际类

ios - LLSimpleCamera 闪光灯按钮标签旋转文本给出 "..."

objective-c - 将整数转换为十六进制

c++ - 构造期间对象类型发生变化

inheritance - CoffeeScript,实现 'implements'

java - 使用方法比较两个类对象

ruby - 如何对 Ruby 中类实例的相同性/相等性进行单元测试?

c# - 如何在 C# 中通过参数获取属性的对象实例?

ios - 如何从套接字连接读取字典列表?

objective-c - 修改TextEdit,使NSTextView具有透明背景。如何?