0

我目前正在对另一位同事编写的代码进行故障排除,该代码使用以下代码出现越界错误。它涉及在 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:]: index 1 beyond bounds for empty array”

不确定错误来自哪里,所以寻找一些建议和提示......

编辑:我在 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"]];

但我返回了类似的错误(超出范围)......

4

2 回答 2

1

用您传入的数组中的-setArray:元素替换现有元素。因此-removeAllObjects是多余的,但这不是您的问题的原因。

您发送-setArray:到的数组的大小完全无关紧要,因此问题可能在于您从中获取元素的数组,即您从中获取的元素:

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

我将通过分配一个临时变量将其分开,然后在调试器之前和之后检查它-setArray:-setArray:设置选项“在 OBjective-C 异常上中断”)。

于 2011-01-17T09:31:54.907 回答
0

我确定了问题的答案(这有点傻)......我应该为我上面编写的代码提供一些上下文。

该代码的目的是使用 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 引用了一个条目,无论是文件还是文件夹)。

希望这是有道理的,并感谢所有看过这个问题的人......

问候

爱德华

于 2011-01-17T17:17:42.510 回答