9
2012-06-15 17:53:25.532 BadgerNew[3090:707] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[_PFBatchFaultingArray objectAtIndex:]: index (0) beyond bounds (0)'
*** First throw call stack:
(0x353f688f 0x3779d259 0x353f6789 0x353f67ab 0x35d5fee3 0x5a5c9 0x59fd3 0x43819 0x32e63c8b 0x38153 0x38309 0x32e63c8b 0x4142d 0x32e63c8b 0x32ec363d 0x32ec35db 0x32ec2f15 0x32ec2c49 0x35d21 0x32e62cab 0x32e5c7dd 0x32e2aac3 0x32e2a567 0x32e29f3b 0x36fe922b 0x353ca523 0x353ca4c5 0x353c9313 0x3534c4a5 0x3534c36d 0x32e5b86b 0x32e58cd5 0x35a73 0x35a54)
terminate called throwing an exception(lldb) 

何が問題ですか?

メインですぐに中止します。だから私はどの行がこれを引き起こしているのかさえ知りません。

ヒント:シミュレーターで実行します。私のiPhoneで実行します。友達のiPhoneでは動作しません。

4

3 に答える 3

8

あなたはリリーが推測するのに十分な情報を与えていませんでした...しかしここにあなたはいます:

  1. CoreDataを使用していますか?誰かがあなたのCoreDataにデータが含まれていると思いますが、尋ねられたときに何もありません。誰かがfetchedResultsController.fetchedObjectsに最初のオブジェクト(クラッシュレポートに記載されているインデックス0)を要求したが、それが存在しない場合(クラッシュレポートの境界0を超えて)、クラッシュが発生します。
  2. 「範囲を超えたインデックス」は、配列に関連する一般的なエラーノートです。エラーレポートによると、誰かが配列の最初の項目(インデックス0)を要求していましたが、その配列は空でした(境界0)。それはクラッシュです。

修正は、データを要求する前にデータがあることを確認することです。1つの方法はチェックすることです

if ([myArray count] > index)
    value = [myArray objectAtIndex:index];

とにかく、私の最も良い推測は、PFBatchFaultingArrayがCoreDataを参照していることであり、それは簡単な答えがないことを意味します。

CoreDataの更新を強制する認証の失敗などがありましたが、FRCはまだ古いデータを指していますか?「古い」frcが前回のデータと同じ量のデータが残っていると考えた場合、クラッシュが発生しますが、CoreDataの「新しい」データの数は実際には少なくなります。次に、UITableViewの自動更新により、行のデータが要求されますが、これはもう存在しません==クラッシュします。次に、誰かがデータを使用しようとする前に、frcsを更新する必要があります。その更新をいつどこで実行できるかを知るのはあなただけです。

于 2013-01-14T09:25:46.690 に答える
8

わかりました、私は理由を理解したと思います。これは、NSFetchedResultsControllerのキャッシュが原因です。それはくだらないです。NSSortDescriptorを昇順から降順に変更する場合でも、キャッシュを手動で削除する必要があります。

したがって、コンテキストが変更され、キャッシュがこれを認識しない場合、キャッシュは厄介になり、表示されているようなエラーをスローします。これは、XCodeでビルドを押したときに発生する可能性があります。コンテキストは保存されていません(そしてデータが失われています)が、キャッシュはデータがゼロで再起動すると驚いて処理方法がわからないため、保存する必要があると考えています。

キャッシュを削除すると、この問題が解消されます。これが、AppleがUICollectionViewControllerでの使用をやめた理由かもしれないと思います。まさにそのような問題。

編集:行/セクションがNSFetchedResultsControllerのそれぞれのカウントを超えていないかどうかのチェックは機能しません。これも、データが存在するはずであると考えているためですが、そうではありません。

于 2013-08-05T06:28:40.507 に答える
1

NSFetchRequestで「propertiesToFetch」を設定していて、それらのプロパティがデータベースでnilの場合、このエラーも発生します。

修正は、そのプロパティをオプションにし、プリフェッチしないようにすることです。

例:

'Student<--->Backpack'がモデルの場合。

    let fetchRequest = ...
    fetchRequest.propertiesToFetch = ["backpack"]

    ...

バックパックがゼロの場合、クラッシュが発生します。

于 2015-06-01T15:49:28.123 に答える