#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
также помогло с другими методами.