我在实现一个简单的超级/子类方案时遇到了一些麻烦。我在超类中声明了一个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
我做错了什么?
答案 0 :(得分:2)
当Catfish_Man回答时,您的init
方法需要致电[super initWithController:]
。但是,您似乎用您的注释显示了对类/超类继承模型的误解:
我的超类由另一个控制器类初始化。对超级属性的任何调用(在initWithController :)中初始化都是有效的(它们返回值,而不是null)。
当您创建SubclassModel
的实例时,该实例的部分一个RootModel
实例。 RootModel
实例 与<{1}}或SubclassModel
的任何其他实例共享 。
因此,如果“另一个控制器类”创建并初始化RootModel
的实例,而后者又会显示您的RootModel
输出,那么这与您的NSLog
实例完全不同 - 并且SubclassModel
实例中的RootModel
未初始化,因为您没有致电SubclassModel
,因此[super initWithController:]
中的NSLog
显示{{} 1}}。
答案 1 :(得分:1)
您的子类init
方法需要调用[super initWithController:]
,因为那是实际初始化发生的地方。
(或超类initWithController:
需要调用[self init]
,您需要将您依赖的初始化工作移至init
)