我有以下代码:
#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 *,当它明确指定为游戏类型?
答案 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]
中是合理的。