из-за ошибки повторного заполнения массива для приложения target c (iPhone) - PullRequest
0 голосов
/ 17 января 2011

В настоящее время я выполняю поиск и устранение неисправностей кода, написанного другим коллегой, у которого возникла ошибка за пределами следующего кода.это включает выбор элемента в UINavigatorController.Это также включает использование coreData.

код выглядит следующим образом (часть кода была удалена для целей устранения неполадок и ясности)

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

// : so far no errors with these lines of code. indexPath returns [0,0] or [0,1];
NSLog(@" : *** DetailViewController/didSelectRowAtIndexPath() - executing method ..."); 
NSLog(@" : *** DetailViewController/didSelectRowAtIndexPath() - indexPath = %@",indexPath);

// : returns row number (as an integer)

NSLog(@": *** DetailViewController/didSelectRowAtIndexPath() indexPath.row  = %d",indexPath.row);

// : managedObject returns coreData information. 
// Directory *managedObject = (Directory *)[finalArray objectAtIndex:indexPath.row];
// NSLog(@": *** DetailViewController/didSelectRowAtIndexPath() managedObject  = %@",managedObject);

// example return

/* 
  <Directory: 0x5919e50> (entity: Directory; id: 0x59195d0 <x-coredata://FE8A3A0C-A0E4-4E0E-A90D-8471227D2284/Directory/p3> ; data: {
  ID = 48;
  IsFile = 0;
  LastChanged = "2011-01-04 14:39:00 +0000";
  Name = "All Papers by Author";
  ParentID = 7;
  Type = pdf;
  } 
*/

 // : returns the ID value from the managed object
 self.num = [managedObject ID];
 NSLog(@": *** DetailViewController/didSelectRowAtIndexPath() self.num (managedObject.ID)  = %@",[managedObject ID]);


 NSMutableArray *tempArray = [[NSMutableArray alloc] initWithArray:finalArray];

 // : finalArray has two elements when this method runs
 NSLog(@"eja: DetailViewController/didSelectRowAtIndexPath() finalArray length is %i",[finalArray count]);

 [self.finalArray removeAllObjects]; // releases the objects, but makes the array empty;

 // : finalArray after remove all objects runs
 NSLog(@"eja: DetailViewController/didSelectRowAtIndexPath() finalArray length is %i",[finalArray count]);

// ** THE OUT OF BOUNDS ERROR OCCURS HERE **
 [self.finalArray setArray:[self searchDatabase:[self.num intValue] withPredicate:@"ParentID"]];**


 // NSLog(@": DetailViewController/didSelectRowAtIndexPath() finalArray  is %@",self.finalArray); 

// ... more code here, but not relevant.

 // : release the temp NSMutable array

 [tempArray release];

 // : maybe release the finalArray?


}

Когда я отлаживаю приложение, я считаю, что finalArrayдолжен быть очищен (removeAllObjects) и должен быть повторно заполнен, но я получаю ошибку выхода за границы

Завершение приложения из-за необработанного исключения 'NSRangeException', причина: '* - [NSMutableArray objectAtIndex:]: индекс 1 вне границ для пустого массива '

Не уверен, откуда исходит ошибка, поэтому ищите несколько советов и советов ...

РЕДАКТИРОВАТЬ: iдобавил новый оператор трассировки после оператора removeAllObjects

// : finalArray after remove all objects runs
 NSLog(@"eja: DetailViewController/didSelectRowAtIndexPath() finalArray length is %i",[finalArray count]);

, он возвращает счетчик 0. Итак, я должен подозревать, что, поскольку он имеет нулевую длину, у него нет места для перераспределения памяти для добавления новых элементов?Я думал, что именно так работают изменяемые массивы (более или менее).

РЕДАКТИРОВАТЬ 2: Вместо setArray я также попытался добавить ObjectsFromArray, заменив это:

[self.finalArray setArray:[self searchDatabase:[self.num intValue] withPredicate:@"ParentID"]];**

// этим

[self.finalArray addObjectsFromArray:[self searchDatabase:[self.num intValue] withPredicate:@"ParentID"]];

но мне вернулась похожая ошибка (за пределами) ...

Ответы [ 2 ]

1 голос
/ 17 января 2011

-setArray: заменяет существующие элементы элементами из передаваемого вами массива. Таким образом, -removeAllObjects является избыточным, но это не является причиной вашей проблемы.

Размер массива, которому вы отправляете -setArray:, совершенно не имеет значения, поэтому проблема, вероятно, заключается в массиве, из которого вы получаете элементы, то есть тот, который вы получаете:

[self searchDatabase:[self.num intValue] withPredicate:@"ParentID"]

Я бы выделил это, назначив временную переменную, а затем проверил бы ее в отладчике до -setArray: и после -setArray: (установите опцию "разбить исключения OBIVE-C").

0 голосов
/ 17 января 2011

Я определил ответ на вопрос (и это немного глупо) ... Я должен дать некоторый контекст коду, который я написал выше.

Целью кода было использование UINavigationController для отображенияинформация о каталогах и файлах.Проблема была в логике кода.finalArray - это список того, что нужно отобразить (т. е. список каталогов или файлов), а tempArray содержит текущий каталог.

Все, что мне нужно, - дополнительный код для определения длины ...

// the following code was placed BELOW the code listing in the original question

if  ([finalArray] count == 0){
  // other code here
  finalArray = tempArray; // reassign the current value (a list of files in this case) back to the current array...
} else {

  // we will assign finalArray with the value of TempArray first, as "we are not done recursing through"
  finalArray = tempArray;

  //  other code here

}

Ошибка выхода за границы была обнаружена в результате перехода к дочернему представлению в UINavigationController и нажатия кнопки «назад».так как отображение не было обновлено новыми пунктами меню (будь то файлы или списки папок), «finalArray» постоянно был не в порядке с тем, что на самом деле отображалось (следовательно, выходит за пределы - там может быть 2 записи, но, возможно, finalArray ссылается на однузапись, будь то файл или папка).

Надеюсь, что это имеет смысл, и спасибо всем, кто посмотрел на этот вопрос ...

С уважением

Эдвард

...