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インスタンスは、またはの他のインスタンスと共有されませんSubclassModelRootModel

したがって、「別のコントローラークラス」が のインスタンスを作成して初期化し、それが出力RootModelを表示する場合、それはインスタンスとNSLogはまったく異なるオブジェクトです。インスタンスの一部である は、呼び出さないため、初期化されません。、したがって、ショーであなた。SubclassModelRootModelSubclassModel[super initWithController:]NSLogSubclassModelnil

于 2013-04-02T17:52:35.067 に答える
1

実際の初期化が行われる場所であるため、サブクラスinitメソッドは を呼び出す必要があります。[super initWithController:]

(または、スーパークラスinitWithController:が を呼び出す[self init]必要があり、依存している初期化作業を に移動する必要がありますinit)

于 2013-04-02T17:34:11.163 に答える