2011-01-17 5 views
0

の配列を再パックしています。現在、次のコードで範囲外エラーが発生している別の同僚によって書かれたコードのトラブルシューティングを行っています。それは、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を追加してみました...

+0

あなたの投稿を編集し、その例としては、読みやすくするために提供された「コード」のマークアップを使用してください。あなたの例を読んで問題を特定するのは非常に難しいです。さらに、デバッガでアプリケーションを実行して、どの行がその例外をトリガしているかを確認してください(Xcodeの「実行」メニューに「目的のC例外」があります)。あなたのクラッシュの原因となっている線を特定できれば、根本原因を特定する準備がはるかに良いはずです。 – Jonah

+0

私はデバッガを実行しました。エラーの原因となったコード行は[self.finalArray setArray:[self searchDatabase:[self.num intValue] withPredicate:@ "ParentID"]]でした。 。私はこれを反映するために上記のコードを再編集しました。ご意見をいただきありがとうございます。 – djeddiej

+0

@Jonah正しくフォーマットするための質問を編集しました。:) –

答えて

1

-setArray:は、渡している配列の要素で既存の要素を置き換えます。したがって、-removeAllObjectsは冗長ですが、これはあなたの問題の原因ではありません。

問題は、おそらくあなたはから取得1すなわちから要素を取得している配列であるので、あなたが-setArray:を送信配列のサイズは完全に無関係です:

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

私がすることによって、そのを分離うtemp変数を割り当てて、-setArray:の前と-setArray:の後にデバッガで検査します(オプション "objective-C例外のブレーク"を設定します)。

+0

私はあなたのコメントに基づいてこの問題の調査を続けており、あなたのフィードバックのためにスレッドをアクティブに保ちます! – djeddiej

+0

ジェレミーあなたの一般的なトラブルシューティングのヒントが私に正しい道を導いたので、私はあなたにチェックマークを付けました。ありがとうございます – djeddiej

+0

@djeddiej:ポイントありがとうございます。しかし、技術的には、たとえそれが自分のものであっても、質問に最もよく答える答えに受け入れを与えるべきです。あなたの質問に対する正しい答えを得ることだけでなく、他の人のために知識リポジトリを提供することについても忘れないでください。あなたの答えが私の人よりも多くの人に役立つと思うなら、あなたの決定を変えるべきです。 – JeremyP

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」と呼びます(範囲外です。ファイルかフォルダかを問わず)。これは、この質問を見てすべての人には意味と感謝を作る

希望...

よろしく

エドワード

関連する問題