2

アプリデリゲートにこの機能を含むコアデータ迅速なプロジェクトにXcodes自動生成コードを使用しています:

func saveContext () {
        if let moc = self.managedObjectContext {
            var error: NSError? = nil
            if moc.hasChanges && !moc.save(&error) {
                // Replace this implementation with code to handle the error appropriately.
                // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
                NSLog("Unresolved error \(error), \(error!.userInfo)")
                abort()
            }
        }
    }

エラーに関する詳細を含むメッセージを出力するのではなく、管理対象オブジェクトにエラーがあると、アプリがエラーでクラッシュしEXC_BAD_INSTRUCTIONます。

ドキュメントには次のように書かれています。

NSError オブジェクトへのポインター。NSError オブジェクトを作成する必要はありません。NULL を渡すと、最初の失敗の後に保存操作が中止されます。

errornil であるため、アプリは中止されますか? これはバグですか、それとも予想される動作ですか? (そして、それが予想される場合、クラッシュする代わりにエラーから回復するためにどのようなアプローチをとるべきですか?)

(私は Xcode 6.3.1 を実行しています)

編集 1:エラーはmoc.save関数ではなく関数にあります。abort()たとえば、abort をコメントアウトしてもクラッシュは停止せず、NSLog に到達することはありません。

EXC_BAD_INSTRUCTION うわあああああ

編集 2バックトレースのスクリーンショットを追加 (?)

バックトレース 悲しみ

4

1 に答える 1

0

そもそもエラーの原因を調べました。単純なモデル検証エラー (必須属性が欠落しているオブジェクトを保存しようとする) だと思っていましたが、すべての属性はオプションです。

問題は、NSCoding を採用していないオブジェクトの配列を保存しようとしていた Transformable 属性であることがわかりました。

私はそれを修正し、意図的に他のタイプのエラー (モデルの検証など) を引き起こそうとしましたが、save関数は期待どおりに機能します。

変換可能なものに対して賢明なエラーが発生しなかったのは残念ですが、それ以外は機能していて、良い学習体験でした!

于 2015-04-25T23:08:30.573 に答える