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:]: インデックス 1 が空の配列の境界を超えています'

エラーの原因がわからないので、アドバイスやヒントを探しています...

編集: removeAllObjects ステートメントの後に新しい trace ステートメントを追加しました

// : 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は1つを参照している可能性がありますファイルかフォルダかを問わず、エントリ)。

これが理にかなっていることを願って、この質問を見たすべての人に感謝します...

よろしく

エドワード

于 2011-01-17T17:17:42.510 に答える