2011-07-03 3 views
0

ОК, поэтому у меня есть код с объектом класса, называемым «игра». Каждый кадр (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, если вам нужны какие-либо другие данные, просто напишите, если я что-то забуду, у меня просто нет идеи.

UPDATE: 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]]; 

UPDATE 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

'NSInvalidArgumentException', reason: '-[NSCFString updatePlayersAndMonsters:monsters:]: означает ТНТ вы пытаетесь отправить updatePlayersAndMonsters в объект String. Вы переназначаете game, чтобы указать на что-то еще?

+0

Хорошо, что на самом деле странно ... Хм я не думаю, что я делаю, извиняюсь за то, что ты ноб - что ты имеешь в виду, переназначая, чтобы указать на другое место? Благодаря! –

+0

Существует несколько способов получить такую ​​ошибку. Один из способов заключается в том, чтобы сделать что-то вроде этого: 'game = '. Другой способ (и, скорее всего, с учетом вашего последнего обновления) заключается в том, что игровой объект был выпущен, а в ячейке памяти, которая использовалась для хранения вашего игрового объекта, теперь есть что-то еще. – jjwchoy

+0

Инструмент инструментов в xcode действительно полезен для отладки такого рода вещей. Если вы можете запустить его в симуляторе, попробуйте запустить его с помощью инструмента Zombies. Этот инструмент скажет вам, когда вы отправляете сообщение на объект, который был выпущен, и он покажет вам все allocs/сохраняет/релизы/автореализаторы, чтобы помочь вам найти, где вы перевыпускали (или не сохраняли) – jjwchoy

3

Поскольку вы подразумеваете, что функция обновления [game updatePlayersAndMonsters:@"0" monsters:@"0"]; вызываются в течение первых 5 секунд вашей игры, а затем вы получите сообщение об ошибке, я думаю, что game объект не правильно сохранен, поэтому будет освобождён и последующая попытка отправка сообщения ему не удалась, потому что какой-то объект NSString повторно использовал свою память (и у нее нет селектора updatePlayersAndMonsters:monsters).

Просьба поделиться, как создается game (alloc/init) и как он хранится в ваших классах, чтобы помочь вам дальше.

Активация отслеживания NSZombies также может помочь диагностировать это.

EDIT: после добавления кода

Мне кажется, что в строке:

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

вы устанавливаете либо локальную переменную или Ивара на ваш autoreleased GameNode.

Теперь, поскольку вы не пользуетесь недвижимостью, и я не вижу никаких сохранений на вашем автореализованном GameNode, моя гипотеза кажется подтвержденной.Либо присвоить сохранить имущество:

self.game = [GameNode ...]; 

быть игра объявлена ​​как:

@property (nonatomic, retain)... 

или сделать сохранить себя:

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

Обновлено. Благодарю. –

+0

Я пытаюсь с зомби, но каждый раз, когда он просто падает, а затем не показывает объект или что-то еще ... Это странно .. Я использую Xcode 4> Product> profile> Zombies .. Он всегда работает, но теперь это просто простые сбои и ничего больше. –

+0

ОК, так что добавьте сохранение, но все же автореферат? Также иногда мне нужно удалить игровой объект и создать новый, так что я делаю это точно с сохранением? Благодаря!! –

Смежные вопросы