#iphone #objective-c #ios4
#iPhone #objective-c #ios4
Вопрос:
Когда я выполняю следующее, мое приложение выходит из строя, и я получаю сообщение об ошибке (terminate вызывается после создания экземпляра ‘NSException’) всякий раз, когда я запускаю симуляцию:
for (...)
[Array1 replaceObjectAtIndex:i withObject: [NSString stringWithFormat:@" Trip %i",i 1]]
Хорошо, после написания проблемы я обнаружил, что ошибка «0 выходит за пределы пустого массива».
Комментарии:
1. Можете ли вы опубликовать полный код цикла, а также распечатку создаваемого исключения?
2. Опубликуйте еще немного кода, показывающего инициализацию класса и то, как он используется и выпущен. Что является исключением? Велика вероятность, что объект, который вы пытаетесь заменить, существует не так, как вы думаете.
3. Замените ваше for на
for (int i=0; i<[Array1 count]; i )
.
Ответ №1:
Вам действительно, действительно нужно опубликовать тип исключения и ваш код, чтобы дать нам разумный шанс решить вашу проблему. Тем не менее, я все равно собираюсь попробовать это сделать.
Я предполагаю, что ваш код выглядит примерно так:
Array1 = [[NSMutableArray alloc] initWithCapacity: someNumber];
for (i = 0 ; i < someNumber ; i)
{
[Array1 replaceObjectAtIndex:i withObject: [NSString stringWithFormat:@" Trip %i",i 1]];
}
Все массивы начинаются с 0 объектов в них, даже если вы используете -initWithCapacity:
. Этот метод предоставляет среде выполнения только подсказку о том, что массив в какой-то момент увеличится до указанного размера. Вам нужно использовать -addObject:
.
Редактировать
Да, судя по вашей правке, я уверен, что я прав. Массив изначально был пустым, и вы пытаетесь заменить объект с индексом 0, которого там еще нет.
Приведенный выше код следует изменить следующим образом:
array1 = [[NSMutableArray alloc] initWithCapacity: someNumber]; // fixed naming convention too :-)
for (i = 0 ; i < someNumber ; i)
{
[array1 addObject: [NSString stringWithFormat:@" Trip %i",i 1]];
}
-addObject:
добавляет новые объекты в конец массива.
Если вам нужно что-то, что больше похоже на массив C или Java, вы можете предварительно заполнить массив NSNull
объектами
array1 = [[NSMutableArray alloc] initWithCapacity: 6]; // fixed naming convention too :-)
for (i = 0 ; i < 6 ; i)
{
[array1 addObject: [NSNull null]];
}
// Now the following will work
[array1 replaceObjectAtIndex: 4 withObject: @"foo"];
Комментарии:
1. да, вы правы, но не могли бы вы, пожалуйста, сказать, где мне следует использовать AddObject?? должно ли это быть при инициализации массива?? просто приведите пример того, как использовать, потому что у меня действительно не так много знаний о массивах objective-c.
2. я действительно думал об этом некоторое время, но не знал, как заполнить его какими-либо случайными объектами
3. спасибо, но еще одна вещь, пожалуйста, покажите мне пример того, как я должен это сделать и где??
Ответ №2:
если вы используете replaceObjectAtIndex
метод с NSArray
объектом типа array, существует вероятность получения исключения (сбой).
Используется NSMutableArray
для управления изменяемым массивом объектов.
Хотя replaceObjectAtIndex
также может быть вызвано следующее исключение для объекта и индекса
Индекс: выдает значение, NSRangeException
если индекс находится за пределами конца массива.
Объект: выдает сообщение, NSInvalidArgumentException
если передаваемый вами объект равен нулю.
Ответ №3:
Хорошо, вот предположение (я не могу сделать лучше без дополнительной информации):
Вы не можете изменить объект, над которым выполняете итерацию.
(Плохой) пример:
for (NSObject *obj in Array1){
[Array1 replaceObjectAtIndex:i withObject: [NSString stringWithFormat:@" Trip %i",i 1]]
}