2013-06-12 3 views
-1

Я люблю эту ошибку here, но пришел к выводу, что ошибка возникает из-за того, что массив пуст. Однако мой массив не пуст.[__NSArrayM objectAtIndex:]: индекс 517431040 за пределами границ [0 .. 48]

-(void)setNumberInTippfield:(NSNumber *)aNumber{ 
    NSNumber *index = [self.ticket.currentSlip intValue]-1; 
    NSLog(@"index: %i",index);//prints 0, expected 
    Slip *slip = [self.slipArray objectAtIndex:index]; 
    NSNumber *number = [NSNumber numberWithInt:[aNumber intValue]-1 ]; 
    NSLog(@"number: %@",number);//prints out number, e.g. 25, as expected 
    NSMutableArray *tNumberArray = [[NSMutableArray alloc] init]; 
    tNumberArray= [NSMutableArray arrayWithArray:slip.numberArray]; 
    //after this line, debugger tells me the array has 49 objects, as expected 
    [[tNumberArray objectAtIndex:number] setSelected:YES];//this line throws exception 
    //this line seems to get executed 3 times, as I can see from the breakpoints 
} 

после того, что он бросает исключение:

*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** - 
[__NSArrayM objectAtIndex:]: index 517431040 beyond bounds [0 .. 48]' 

Я думал, что number держит адрес вместо значения, но NSLog говорит мне правильное значение. Любые намеки на это? Заранее большое спасибо.

+0

Какой вызов 'objectAtIndex' выбрасывает это исключение? – trojanfoe

+0

Последняя строка, см. Мое редактирование. – dan

+0

Поскольку NSLog выводит значение [описание объекта], а не сам объект. – borrrden

ответ

2

objectAtIndex: принимает int, а не NSNumber.

// ... 
Slip *slip = [self.slipArray objectAtIndex:[index intValue]]; 

Edit:

Следующая строка вызывает вопрос, тоже:

NSNumber *index = [self.ticket.currentSlip intValue]-1; 

Не следует ли результат быть int? Это поможет устранить проблемы.

+0

То же самое касается второго экземпляра 'objectAtIndex:' – borrrden

+0

super! он работает, спасибо! Однако первый экземпляр этого произведения странный. – dan

+0

@dan - это не «странно», вы присвоили значение «int» ('[self.ticket.currentSlip intValue] -1'0 указателю, которое является законным в C. Затем вы передаете этот указатель как integer '[self.slipArray objectAtIndex: index]', снова законный, и все это работает. Вам нужно убедиться, что вы понимаете разницу между примитивным типом значений, таким как 'int', и объектом, который представляет значение, например как «NSNumber» - эти два не являются взаимозаменяемыми. (Может быть, вы привыкли к C#, где (un) бокс является автоматическим?) – CRD

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