0

私は次のコードを持っています:

#import <Foundation/Foundation.h>
#import "Game.h"

@interface World : NSObject

@property (nonatomic, strong) Game *game;

+(id)sharedInstance;

//---------------------------------------

#import "World.h"

@implementation World

@synthesize game = _game;

+(id)sharedInstance {
    DEFINE_SHARED_INSTANCE_USING_BLOCK(^{
    return [[self alloc] init];
});
}

しかし、ゲームのプロパティを設定しようとすると:

-(id)initWithLevelIdentifier:(int)identifier {
    if (self = [super init]) {
        self.currentLevel = [[Level alloc] initWithIdentifier:identifier];
        // stuff

        [[World sharedInstance] setGame:self];
    }

    return self;
}

「'Game *__strong' 型の左辺値で 'int *' 型のパラメーターを初期化できません」

Game 型として明確に指定されているのに、これが int * であると考えるのはなぜですか?

4

1 に答える 1

0

ここには循環依存関係があります。きっとGame.hインポートもWorld.h@class と #import を参照してください。ヘッダーのコンパイル時間は Clang で節約できますか? .

World.h解決策は、それGameがクラスであることに注意するだけで、ヘッダーをインポートしないことです。

#import <Foundation/Foundation.h>

@class Game;    // <=== rather than #import

@interface World : NSObject

@property (nonatomic, strong) Game *game;

+(id)sharedInstance;

ここのコードにも設計上の問題があることに注意してください。Gameオブジェクトを作成するだけで、現在のWorldゲームが変わります。Gameこれは、非シングルトンとして扱うのが非常に難しいことを意味します(作成するだけでグローバル状態が変更されます)Gameが、シングルトンではありません。これは、初期化メソッドでの非常に驚くべき動作です。setGame:呼び出しを外部に移動し、initこれが現在のグローバルな現在のゲームであるかどうかを呼び出し元に決定させる方がよいでしょう。Worldとして 入れるのが妥当でしょう-[World createNewGame]

于 2012-10-10T14:02:59.250 に答える