Сбой программы, нужна помощь, чтобы найти проблему хотя бы где искать - PullRequest
0 голосов
/ 02 января 2011

Я получаю следующие сообщения перед сбоем:

2011-01-02 00:55:15.935 XXXX[7981:207] answerButton1    
2011-01-02 00:55:15.938 XXXX[7981:207] >>>>>>>>>>>>>>>>>>>>nrQPlayer: 2
2011-01-02 00:55:15.939 XXXX[7981:207] =========whatPlayerCount===========
2011-01-02 00:55:15.939 XXXX[7981:207] ==whatPlayerCount== 1
2011-01-02 00:55:15.940 XXXX[7981:207] =========Spelare 1===========
2011-01-02 00:55:15.940 XXXX[7981:207] oooooooEND OF PLAYER!oooooooooo
2011-01-02 00:55:15.941 XXXX[7981:207] ooooooooooBEFORE IFooooooooooo
2011-01-02 00:55:15.942 XXXX[7981:207] INIT 0x5b9be30
2011-01-02 00:55:16.563 XXXX to be able to fix it[7981:207] *** -[ErrorMessage respondsToSelector:]: message sent to deallocated instance 0xca25ff0

Я пытался отследить, где именно проблема, пытался проверить «сохранить» в некоторых местах, но сейчас у меня заканчиваются варианты. Когда я пытаюсь запустить отладчик с точкой останова, но он застревает, и я не могу сделать шаг вперед.

Буду признателен за любую возможную помощь. Я тоже новичок в этом, что не делает ситуацию лучше: -)

Вот та часть кода, которая дает сбой:

case 2: // Два игрока

        //nrQPlayer antal spelare
        NSLog(@"=========whatPlayerCount===========");
        NSLog(@"==whatPlayerCount== %i", whatPlayerCount);
        switch (whatPlayerCount) {
            case 1:
                NSLog(@"=========Spelare 1===========");
                playerDiff = 1;
                whatPlayerCount = 2;
                thePlayer = 0;
                NSLog(@"oooooooEND OF PLAYER!oooooooooo");
                break;
            case 2:
                NSLog(@"=========Spelare 2===========");
                playerDiff = 3;
                whatPlayerCount = 1;
                thePlayer = 2;
                break;
            default:
                NSLog(@"=========break===========");
                break;
        }
        NSLog(@"ooooooooooBEFORE IFooooooooooo");
        NSLog(@"INIT %p", self);
        // >>>>>>>>HERE IS WHERE THE CRASH HAPPENS<<<<<<<<<<
        if (askedQuestions < nrOfQuestionsPerPlayer) {
            NSLog(@"1");
            if ([[finalPlayersInGame objectAtIndex:playerDiff] intValue] == 1) { // HARD
                NSLog(@"HARD 1");
                questionNr = [[hardQArray objectAtIndex:askedQuestions] intValue];
                qArray = [readQuestionFunction readQuestion: questionNr];
                question_TextView.text = [qArray objectAtIndex:0];
                NSLog(@"HARD - qNr: %i", questionNr);
            } 
            else if ([[finalPlayersInGame objectAtIndex:playerDiff] intValue] == 2) { // MEDIUM
                NSLog(@"2");
                questionNr = [[mediumQArray objectAtIndex:askedQuestions] intValue];
                qArray = [readQuestionFunction readQuestion: questionNr];
                question_TextView.text = [qArray objectAtIndex:0];
                NSLog(@"MEDIUM - qNr: %i", questionNr);
            }
            else if ([[finalPlayersInGame objectAtIndex:playerDiff] intValue] == 3) { // EASY
                NSLog(@"3");
                questionNr = [[easyQArray objectAtIndex:askedQuestions] intValue];
                qArray = [readQuestionFunction readQuestion: questionNr];
                NSLog(@"qArray: %@", qArray);
                NSLog(@"questionNr: %i", questionNr);
                question_TextView.text = [qArray objectAtIndex:0];
                NSLog(@"EASY - qNr: %i", questionNr);
            }
            NSLog(@"ooooooooooAFTER IFooooooooooo");

            NSLog(@"4");
            playerName_Label.text = [NSString stringWithFormat:@"Spelare: %@", [finalPlayersInGame objectAtIndex:thePlayer]];
            playerResult_Label.text = [NSString stringWithFormat:@"Fråga %i av %i", askedQuestions, nrOfQuestionsPerPlayer];

            //========CALL AccesQuestionDB MODULE TO SHUFFLE PLAYERS=========//
            AccessQuestionsDB *shufflePlayersFunction = [AccessQuestionsDB new];

            buttonOrder = [[NSMutableArray alloc] initWithObjects:@"1", @"2", @"3", nil];

            buttonOrder = [shufflePlayersFunction shufflePlayers: buttonOrder]; // Use shufflePlayers to shuffle button also
            NSLog(@"buttonOrder: %@", buttonOrder);
            [shufflePlayersFunction release];
            NSLog(@"5");
            //========CALL buttonsOrder=========//
            ButtonOrderAccess *buttonOrderFunction = [ButtonOrderAccess new];
            [buttonOrderFunction saveButtonOrder: buttonOrder];
            [buttonOrderFunction release];

            NSLog(@"qArray: %@", qArray);
            NSLog(@"buttonOrder: %@", buttonOrder);
            [self.answerButton1 setTitle:[qArray objectAtIndex:[[buttonOrder objectAtIndex:0]intValue]] forState:UIControlStateNormal];
            [self.answerButton2 setTitle:[qArray objectAtIndex:[[buttonOrder objectAtIndex:1]intValue]] forState:UIControlStateNormal];
            [self.answerButton3 setTitle:[qArray objectAtIndex:[[buttonOrder objectAtIndex:2]intValue]] forState:UIControlStateNormal];


            if (firstQuestion == YES) {
                firstQuestion = NO;
                //secondQuestion = YES;
            }
            else {
                askedQuestions++;
                firstQuestion = YES;
            }



        }
        else {
            // Call Error Message
            ErrorMessage *callErrorMessageFunction = [ErrorMessage new];
            [callErrorMessageFunction questionError: @"Q2"];
            [callErrorMessageFunction release];
        }

Ответы [ 3 ]

1 голос
/ 02 января 2011

Используйте NSZombie, объект, который перехватывает сообщения, отправленные на освобожденные объекты, и печатает информацию в консоли.

См. Этот вопрос для получения подробных инструкций: Как запустить программу iPhone с инструментом Zombies?

0 голосов
/ 02 января 2011

Мы не можем знать, что происходит за экраном, например здесь:

ErrorMessage *callErrorMessageFunction = [ErrorMessage new];
[callErrorMessageFunction questionError: @"Q2"];
[callErrorMessageFunction release];

но вполне может быть, что что-то в этом ErrorMessage объекте должно жить немного дольше.

Чтобы исправить это, не release, а autorelease. По возвращении в runloop объект будет жить, что может быть достаточно долго для ваших (неизвестных) целей.

Типичная последовательность будет тогда:

ErrorMessage *callErrorMessageFunction = [[[ErrorMessage alloc] init] autorelease];
[callErrorMessageFunction questionError: @"Q2"];

(я предпочитаю alloc + init вместо new, но они эквивалентны)

0 голосов
/ 02 января 2011

Вы либо выпускаете что-то, что не должны выпускать, либо не сохраняете автоматически выпущенный объект, который вам нужно хранить.Читайте документы по управлению памятью.Мы не видим достаточно вашего кода здесь, чтобы знать, что это такое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...