Eli_Rozen
Eli_Rozen

Reputation: 1301

Unrecognized selector sent to instance - why?

OK so I have a code with an class object called "game". Every frame (60 FPS) I update that object with function that gets a string. After like 5 seconds of running the game I'm getting the unrecognized selector sent to instance error.

The update:

[game updatePlayersAndMonsters:@"0" monsters:@"0"];

The function:

-(void)updatePlayersAndMonsters:(NSString*)players monsters:(NSString*)monsters {
    CCLOG(@"%@.%@", players, monsters);
}

I don't understand what's going on. The error:

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'

What should I do? Thanks. Also IDK if any other details you need, so just write if I forget something, I just don't have an idea.

UPDATE: Gmae is object of class 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])) {

I create it with:

game = [GameNode GmameNodeWithMapID:ChoosenMapID scene:self players:Thing[5] monsters:Thing[6] monsterCount:Thing[4]];

UPDATE 2

I create the SomeScene:

+(id) scene {
    CCScene *s = [CCScene node];
    id node = [SomeScene node];
    [s addChild:node];
    return s;
}
-(id) init {
    if( (self=[super init])) {

I use it:

[[CCDirector sharedDirector] replaceScene: [CCTransitionRadialCW transitionWithDuration:1.0f scene:[LoginScene scene]]];

Upvotes: 0

Views: 5843

Answers (2)

sergio
sergio

Reputation: 69027

Since you imply that the update function [game updatePlayersAndMonsters:@"0" monsters:@"0"]; is called for the first 5 seconds of your game and then you get the error, my guess is that the game object is not correctly retained, so it gets deallocated and the successive attempt of sending a message to it fails because some NSString object has been reusing its memory (and it does not have a updatePlayersAndMonsters:monsters selector).

Please share how game is created (alloc/init) and how it is stored in your classes to help you further.

Activating NSZombies tracking could also help to diagnose this.

EDIT: after you adding the code

It seems to me that in the line:

 game = [GameNode GmameNodeWithMapID:ChoosenMapID scene:self players:Thing[5] monsters:Thing[6] monsterCount:Thing[4]];

you are setting either a local variable or an ivar to your autoreleased GameNode.

Now, since you are not using a property, nor I can see any retain on your autoreleased GameNode, my hypothesis seems confirmed. Either assign to a retain property:

self.game = [GameNode ...];

being game declared as:

@property (nonatomic, retain)...

or do a retain yourself:

 game = [[GameNode GmameNodeWithMapID:ChoosenMapID scene:self players:Thing[5] monsters:Thing[6] monsterCount:Thing[4]] retain];

Upvotes: 3

jjwchoy
jjwchoy

Reputation: 1908

'NSInvalidArgumentException', reason: '-[NSCFString updatePlayersAndMonsters:monsters:]: means tht you are trying to send updatePlayersAndMonsters to a String object. Are you reassigning game to point to something else?

Upvotes: 2

Related Questions