singleton setter认为它正在收到一个int *?

时间:2012-10-10 13:37:38

标签: objective-c

我有以下代码:

#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 *'类型的参数”

为什么它被认为是一个int *,当它明确指定为游戏类型?

1 个答案:

答案 0 :(得分:0)

这里有循环依赖。我打赌Game.h也会导入World.h。请参阅@class vs. #import in header compile time saving with 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]中是合理的。