加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在Objective-c中继承实例变量

发布时间:2020-12-16 05:48:36 所属栏目:百科 来源:网络整理
导读:在 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@interfa
在 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是正确的,正常的实例变量是默认而不是公共的,固定的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读