0

カスタムinitメソッドを持つ基本クラスがあり、initメソッドを介して渡された値を使用して、そのサブクラスでカスタムinitメソッドを呼び出します。問題は、サブクラス Via を介して基本クラスで値が割り当てられている変数にアクセスしようとするとsuper、値が null になり、基本クラスがまったく別のオブジェクトのようになります。基本クラスがまだinitメソッドから戻っていないためですか?または、ここで継承を間違った方法で行っていますか? 従うべきコード。

インターフェース

@interface WTFGameBoard : NSObject
{
    @protected
    UIView *_answerView;
    UIView *_keyboardView;
    NSMutableArray* _answerSeperatedByCharacter;

    WTFAnswerBoard *_answerBoard;
    WTFGameKeyboard *_gameKeyboard;

    OpenGameViewController *_weakGameViewRef;
    GameInfo *_gameinfo;
}

-(id) initWithGameVC:(OpenGameViewController*)gameVC;

@property (nonatomic,unsafe_unretained)OpenGameViewController *weakGameViewRef;
@property (nonatomic,strong)GameInfo *gameInfo;

@end

実装

@implementation WTFGameBoard
@synthesize weakGameViewRef = _weakGameViewRef;
@synthesize gameInfo = _gameinfo;

-(id) initWithGameVC:(OpenGameViewController*)gameVC
{
    if (self = [super init])
    {
        //[weakGameViewRef ]
        _answerView = [gameVC answerView];
        _keyboardView = [gameVC keyboardView];

        self.weakGameViewRef = gameVC;
        self.gameInfo = [[CurrentGamesInfo sharedCurrentGamesInfo]_selectedGame];

        _answerBoard = [[WTFAnswerBoard alloc] initWithAnswer:[gameVC answer] blankSpaceImageView:[gameVC answerBox]];
        _gameKeyboard = [[WTFGameKeyboard alloc] initWithButtons:[gameVC letterSelectButtons]];

    }

    return self;
}

@end

インターフェース

@interface WTFAnswerBoard : WTFGameBoard
{
    NSMutableArray *WTFAnswerSpaces;
    NSMutableArray *_answerBlankBlocks;
    NSMutableArray *_answerGiven;
    NSMutableArray *_answerBlankOriginalPosition;
    NSString *_answer;
}

-(id)initWithAnswer:(NSString*)answer blankSpaceImageView:(UIImageView*)answerBox;

実装

-(id)initWithAnswer:(NSString*)answer blankSpaceImageView:(UIImageView*)answerBox
{
    if ( self = [super init] )
    {
        _weakGameViewRef = [super weakGameViewRef];//WHY U NO NOT BE NULL?
        _gameinfo = [super gameInfo];//WHY U NO NOT BE NULL?

        _answerBlankBlocks = [_weakGameViewRef answerBlankBlocks];
        _answerGiven = [_weakGameViewRef answerGiven];
        _answerBlankOriginalPosition = [_weakGameViewRef answerBlankOriginalPosition];

        [self SetupBlankAnswerSpacesForAnswer:answer withTemplate:answerBox];
    }

    return self;
}
4

1 に答える 1

0

問題は、派生クラスでカスタム コンストラクターを呼び出していないという事実です。

if ( self = [super init] )

オーバーライドされていないデフォルトのものを呼び出しており、アクセスしようとしている ivar を初期化しません。

カスタム コンストラクターを呼び出す必要があります。

if ( self = [super initWithGameVC:gameVC] )

もちろん、これは、パラメーターを渡すか、パラメーターを必要とせずに初期化したいものを初期化してデフォルトのコンストラクターをオーバーライドする必要があることを意味します。

私が理解していないもう1つのことは、カスタムクラスで派生クラスのivarを設定している理由です:

_weakGameViewRef = [super weakGameViewRef];

ivar は同じであるため、これは基本的に何もしません。基本クラスの 1 つを設定すると、直接アクセスできます。

編集

ここで奇妙な依存関係の問題があるため、簡単な解決策は次のようなものにすることです

WTFAnswerBoard initWithWTFGameBoard:(WTFGameBoard*)board {
  self.board = board;
}

をインスタンス化して継承を維持するボードにアクセスできるようにしますが、再帰的な初期化が発生しないようにWTFAnswerBoardプロパティを追加することにより、使用を構成に切り替えます。WTFAnswerBoard

于 2013-01-25T04:27:31.333 に答える