好的,所以我有一个名为“game”的类对象的代码。每帧(60 FPS)我用获取字符串的函数更新该对象。在运行游戏5秒后,我发现无法识别的选择器被发送到实例错误。
更新:
[game updatePlayersAndMonsters:@"0" monsters:@"0"];
功能:
-(void)updatePlayersAndMonsters:(NSString*)players monsters:(NSString*)monsters {
CCLOG(@"%@.%@", players, monsters);
}
我不明白发生了什么。 错误:
2011-07-03 12:13:19.175 app[65708:207] -[NSCFString updatePlayersAndMonsters:monsters:]: unrecognized selector sent to instance 0xc4e95b0
2011-07-03 12:13:19.176 app[65708:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSCFString updatePlayersAndMonsters:monsters:]: unrecognized selector sent to instance 0xc4e95b0'
我该怎么办?谢谢。如果你需要任何其他细节,也可以IDK,所以如果我忘了什么就写,我只是没有想法。
更新: Gmae是GameNode类的对象:
+(id) GmameNodeWithMapID:(int)MapID_ scene:(SomeScene*)MainScene_ players:(NSString*)Cplayers_ monsters:(NSString*)Cmonsters_ monsterCount:(NSString*)monsterCount_
{
return [[[self alloc] GmameNodeWithMapID:MapID_ scene:MainScene_ players:Cplayers_ monsters:Cmonsters_ monsterCount:monsterCount_] autorelease];
}
-(id) GmameNodeWithMapID:(int)MapID scene:(SomeScene*)MainScene players:(NSString*)Cplayers monsters:(NSString*)Cmonsters monsterCount:(NSString*)monsterCount
{
if( (self=[super init])) {
我用:
创建它game = [GameNode GmameNodeWithMapID:ChoosenMapID scene:self players:Thing[5] monsters:Thing[6] monsterCount:Thing[4]];
更新2
我创建了SomeScene:
+(id) scene {
CCScene *s = [CCScene node];
id node = [SomeScene node];
[s addChild:node];
return s;
}
-(id) init {
if( (self=[super init])) {
我用它:
[[CCDirector sharedDirector] replaceScene: [CCTransitionRadialCW transitionWithDuration:1.0f scene:[LoginScene scene]]];
答案 0 :(得分:3)
由于你暗示在游戏的前5秒调用更新函数[game updatePlayersAndMonsters:@"0" monsters:@"0"];
然后你得到错误,我的猜测是game
对象没有被正确保留,所以它获取释放并且连续尝试向其发送消息失败,因为某些NSString
对象已重用其内存(并且它没有updatePlayersAndMonsters:monsters
选择器)。
请分享game
的创建方式(alloc / init)以及它如何存储在您的课程中以帮助您进一步提升。
激活NSZombies跟踪也可以帮助诊断它。
编辑:添加代码后
在我看来,在线:
game = [GameNode GmameNodeWithMapID:ChoosenMapID scene:self players:Thing[5] monsters:Thing[6] monsterCount:Thing[4]];
您要为自动释放的GameNode
设置局部变量或ivar。
现在,既然你没有使用某个属性,也没有看到你自动释放GameNode
的任何保留,我的假设似乎得到了证实。分配到保留属性:
self.game = [GameNode ...];
将游戏声明为:
@property (nonatomic, retain)...
或保留自己:
game = [[GameNode GmameNodeWithMapID:ChoosenMapID scene:self players:Thing[5] monsters:Thing[6] monsterCount:Thing[4]] retain];
答案 1 :(得分:2)
'NSInvalidArgumentException', reason: '-[NSCFString updatePlayersAndMonsters:monsters:]:
表示您尝试将updatePlayersAndMonsters发送到String对象。您是否重新分配game
指向其他内容?