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

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

4

1 回答 1

0

你在这里有一个循环依赖。我打赌Game.h也进口World.h。在使用 Clang 的标头编译时间中查看@class 与 #import 的对比?.

解决方案是只注意World.hGame是一个类,但不导入标题:

#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并让呼叫者决定这是否是现在的全球当前游戏。将其放入Worldas 是合理的-[World createNewGame]

于 2012-10-10T14:02:59.250 回答