Сбой приложения iOS в конце цикла for

#ios #objective-c #for-loop

#iOS #objective-c #for-цикл

Вопрос:

Я довольно новичок в Objective C, и у меня возникли серьезные препятствия в моем коде… Я создаю (очень) простую карточную игру для запуска на iOS. Все, что вам нужно сделать, это вытягивать карты, пока не выпадет джокер, после чего игра заканчивается. В моем приложении произошел сбой в фигурной скобке в конце цикла for, который создает объекты card для помещения в массив

Вот моя колода.m:

 #import "Deck.h"
#import "Card.h"
@implementation Deck
@synthesize deckArray;

- (void)removeCard {
    [deckArray removeObjectAtIndex:deckArray.count];
}

- (void)generate {
    NSLog(@"Generating deck...");
    NSMutableArray *deckArray = [[NSMutableArray alloc]init];
    for (int i = 0; i < 14; i  ) {
        //Make a card
        Card *card = [[Card alloc]init];
        //Give it some values
        card.value = i   1;
        card.suit = @"Hearts";
        //Put card in array
        [deckArray addObject:card];
        NSLog(@"Added object (%@) to array",card);
    }

    for (int i = 0; i < 14; i  ) {
        //Make a card
        Card *card = [[Card alloc]init];
        //Give it some values
        card.value = i   1;
        card.suit = @"Spades";
        //Put card in array
        [deckArray addObject:card];
        NSLog(@"Added object (%@) to array",card);
    }

    for (int i = 0; i < 14; i  ) {
        //Make a card
        Card *card = [[Card alloc]init];
        //Give it some values
        card.value = i   1;
        card.suit = @"Diamonds";
        //Put card in array
        [deckArray addObject:card];
        NSLog(@"Added object (%@) to array",card);
    }

    for (int i = 0; i < 14; i  ) {
        //Make a card
        Card *card = [[Card alloc]init];
        //Give it some values
        card.value = i   1;
        card.suit = @"Clubs";
        //Put card in array
        [deckArray addObject:card];
        NSLog(@"Added object (%@) to array",card);
    }  //Crashes on this line: Thread 1: Breakpoint 2.1
NSLog(@"Generated deck");
}

- (Card *)topCard {
    return [deckArray objectAtIndex:deckArray.count];
}
@end
 

Я почти уверен, что это самая очевидная вещь в мире, но, опять же, я довольно новичок в программировании в целом

Заранее благодарю вас!

Комментарии:

1. Я не вижу там ничего плохого, но в другом месте… [deckArray removeObjectAtIndex:deckArray.count]; это всегда приведет к сбою вашего приложения. Массив основан на 0, поэтому в нем нет объекта deckArray.count . Вам нужно вычесть 1.

2. Вы уверены, что это сбой, а не просто активная точка останова?

3. то, что я вижу здесь, локально deckArray , скроет глобальное…

4. Журнал сбоев объяснит все, почему приложение разбилось. Пожалуйста, опубликуйте журнал сбоев

Ответ №1:

Я вижу проблему в методах буксировки: removeCard и topCard. Вы пытаетесь получить доступ к объекту, который находится вне пределов:

 [deckArray objectAtIndex:deckArray.count]
 

Если у вас есть 5 элементов в массиве deckArray.count возвращает 5, но последний индекс равен 4 (индекс массивов основан на нуле), поэтому вам нужно заменить вызов deckArray.count на deckArray.count-1.

 - (Card *)topCard {
    return [deckArray objectAtIndex:deckArray.count-1];
}
 

И сделайте то же самое в методе removeCard.

Комментарии:

1. Хм…. Я пробовал обе эти вещи. Чтобы исправить «выход за пределы», просто создав объект topCard в моем ViewController.m, как показано: и я исправил проблему с подсчетом, но все же происходит то же самое…

2. Card *topCard = [deck.deckArray objectAtIndex:deck.deckArray.count - 1];

3. Можете ли вы опубликовать журнал сбоев?

4. Извините за отсутствие общения… Последние пару дней я был очень занят. В коде БЫЛА установлена точка останова… это был несчастный случай. Теперь есть журнал сбоев:

5. 2014-06-25 11:36:11.320 Бомба Джокера [26719:60b] *** Завершение работы приложения из-за неперехваченного исключения ‘NSRangeException’, причина: ‘*** -[__NSArrayM removeObjectAtIndex:]: индекс 56 за пределами [0 .. 55]’ *** Первый стек вызовов throw: ( 0 CoreFoundation 0x000000010194a495 __exceptionPreprocess 165 1 libobjc.A.dylib 0x00000001016a999e objc_exception_throw 43 2 CoreFoundation 0x00000001018f0906 —

Ответ №2:

Эта строка : NSMutableArray *deckArray = [[NSMutableArray alloc]init];

Вы уже объявили deckArray в своем заголовочном файле (.h). Вы должны сделать: deckArray = [[NSMutableArray alloc] init];

Ответ №3:

Как указано в журнале сбоев, мой метод «удалить карту» удалил объект, который не существовал, потому что массивы основаны на нуле. Кроме того, я поставил self. перед deckArray собой, казалось, помогало. Я должен был изучить немного больше Obj-C, прежде чем публиковать этот вопрос, поэтому приношу вам свои извинения. .count - 1 также помогло с другими методами.