2

我在实现一个简单的超/子类方案时遇到了一些麻烦。我在超类中声明了一个 NSMutableDictionary,并试图在子类中访问它,但它只返回 null。任何帮助,将不胜感激。

@interface RootModel : NSObject <Updatable, TouchDelegate>
@property (nonatomic) NSMutableDictionary *gameValues;
@end

@interface SubclassModel : RootModel
@end

@implementation RootModel

- (id)initWithController:(id)controller {
    if ((self = [super init])) {
        _controller = controller;

        _gameValues = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                       [NSNumber numberWithFloat:300.0f], KEY_JUMP_VELOCITY,
                       [NSNumber numberWithFloat:49.47f], KEY_GRAVITY,
                       [NSNumber numberWithFloat:0.25f], KEY_JUMP_TIME_LIMIT,
                       nil];

        NSLog(@"%@", _gameValues);

    }
    return self;
}

@implementation SubclassModel

- (id)init{
    if ((self = [super init])) {
        // This NSLog prints "(null)" if using super.gameValues or self.gameValues, why?
        NSLog(@"subclass: %@", super.gameValues);

    }
    return self;
}
@end

我究竟做错了什么?

4

2 回答 2

2

正如 Catfish_Man 回答的那样,您的init方法需要调用[super initWithController:]. 但是,您的评论似乎表明对类/超类继承模型的误解:

我的超类由另一个控制器类初始化。对超级属性的任何调用(在 initWithController: 中初始化)都是有效的(它们返回值,而不是 null)。

当您创建一个实例时,SubclassModel该实例本身就有一个RootModel实例。该RootModel实例SubclassModel与or的任何其他实例共享RootModel

因此,如果“另一个控制器类”创建并初始化 的实例RootModel,然后显示您的NSLog输出,那么这是与您的实例完全不同的对象SubclassModel- 并且您的实例RootModel的一部分SubclassModel未初始化,因为您不调用[super initWithController:],因此你NSLogSubclassModel节目中nil

于 2013-04-02T17:52:35.067 回答
1

您的子类init方法需要调用[super initWithController:],因为这是实际初始化发生的地方。

(或者超类initWithController:需要调用[self init],并且您需要将您所依赖的初始化工作移至init

于 2013-04-02T17:34:11.163 回答