の配列を再パックしています。現在、次のコードで範囲外エラーが発生している別の同僚によって書かれたコードのトラブルシューティングを行っています。それは、UINavigatorControllerで項目を選択することを含む。また、coreDataも使用されます。範囲外のエラーは、目的のアプリケーション(iPhone)
コードは、この(コードの一部は、トラブルシューティングの目的と明確にするため削除されていた)
-(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?
}
私はアプリをデバッグする場合、私は(removeAllObjects)finalArrayがクリアされることになっていると考えているように見えると想定され再投入されるが、私は
がキャッチされない例外により「NSRangeException」、理由にアプリを終了境界エラーのうちを取得する:「*- [NSMutableArrayのobjectAtIndex:]:空の配列の境界を越えたインデックス1」
エラーがので、いくつかのアドバイスやヒントを探して、どこから来ているわからない...
編集:私はそれが0の数を返し
// : finalArray after remove all objects runs
NSLog(@"eja: DetailViewController/didSelectRowAtIndexPath() finalArray length is %i",[finalArray count]);
removeAllObjects文の後に新しいトレースステートメントを追加しましたそれで、長さがゼロであるので、新しいアイテムを追加するためにメモリを再割り当てする余地がないと私は疑うべきですか?私は、可変配列がどのように機能するか(多かれ少なかれ)だと思っていました。
EDIT 2:(範囲外)
[self.finalArray setArray:[self searchDatabase:[self.num intValue] withPredicate:@"ParentID"]];**
//この
[self.finalArray addObjectsFromArray:[self searchDatabase:[self.num intValue] withPredicate:@"ParentID"]];
と私は同様のエラーが返されました:代わりにはsetArrayの、私はまた、これに代わって、ObjectsFromArrayを追加してみました...
あなたの投稿を編集し、その例としては、読みやすくするために提供された「コード」のマークアップを使用してください。あなたの例を読んで問題を特定するのは非常に難しいです。さらに、デバッガでアプリケーションを実行して、どの行がその例外をトリガしているかを確認してください(Xcodeの「実行」メニューに「目的のC例外」があります)。あなたのクラッシュの原因となっている線を特定できれば、根本原因を特定する準備がはるかに良いはずです。 – Jonah
私はデバッガを実行しました。エラーの原因となったコード行は[self.finalArray setArray:[self searchDatabase:[self.num intValue] withPredicate:@ "ParentID"]]でした。 。私はこれを反映するために上記のコードを再編集しました。ご意見をいただきありがとうございます。 – djeddiej
@Jonah正しくフォーマットするための質問を編集しました。:) –