无法识别的选择器发送到实例 - 为什么?

时间:2011-07-03 09:26:04

标签: objective-c ios

好的,所以我有一个名为“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]]];

2 个答案:

答案 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指向其他内容?