Сбой приложения iPhone

#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]]
}