微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Objective-c中继承实例变量

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是正确的,正常的实例变量是认而不是公共的,固定的.

原文地址:https://www.jb51.cc/c/113624.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐