2

エラーの説明

コア データ (SQLite に基づく) と次のNSManagedObjectサブクラスを使用してローカルに保存されたデータを含むアプリがあります。

import CoreData

@objc(ScoutingEventData)
class ScoutingEventData: NSManagedObject {
    @NSManaged var id: String?
    @NSManaged var type: String?
    @NSManaged var entityId: String?
    @NSManaged var oldStateJson: NSData?
    @NSManaged var newStateJson: NSData?
    @NSManaged var eventDate: NSDate?

    func toInsertEvent() throws -> ScoutingEvent.Insert {
        guard let id = id else { fatalError("events should have an event id") }
        guard let data = newStateJson else { fatalError("insert event should have newStateJson stored") }
    
        // If I uncomment this line, the error goes away. 
        // Somehow by ensuring that data never gets deallocated, the error never occurs.
        // globallllll = data
  
        return ScoutingEvent.Insert(id: id, entity: try ScoutingEntity.from(data))
    }
}

// debugging var to prevent data from being deallocated
var globallllll: NSData?

上記のスニペットのコメントで述べたように、newStateJsonプロパティから読み取った値の割り当てを解除できるようにすると、エラーが発生します。

私が受け取ったエラーは、バックグラウンド スレッドからのものです。

アクセスが悪い

診断ツールでゾンビを有効にすると、代わりにこれが表示されます

ここに画像の説明を入力

また、ゾンビが有効になっている場合、コンソールに次のメッセージが表示されます。

2016-11-18 16:26:13.773 ScoutingData_Example[51750:4716636] *** -[CFData release]: 割り当て解除されたインスタンス 0x7f8c4eb10ae0 に送信されたメッセージ

そして、次のスタック トレース:

ここに画像の説明を入力


これまでに試したこと

NSManagedObjectContextこのデータを取得するために使用された を静的変数に格納して、コンテキストの割り当てが解除されないようにしましたが、効果はありませんでした。

NSData?プロパティをプロパティに変換しString?、データをバイナリ データではなく Base64 でエンコードされた文字列として保存しようとしましたが (バッキング モデルも更新しました)、効果もありませんでした。エラーは引き続き発生しました。

プロパティを読み取るコードをコメントアウトしようとしましたが、エラーは消えましたが、それは明らかに受け入れられる解決策ではありません。

値を読み取った後、値をグローバル変数に格納して、割り当てが解除されるのを防ぎ、エラーが消えないようにしましたが、それも有効な解決策ではありません。

値を使用するすべてのコードをコメントアウトしようとしましたが、代わりに値をコンソールに出力するだけで、エラーが持続しました。これにより、プロパティにアクセスし、後で割り当てを解除するという行為が、このエラーの条件を作成するものであると私は信じています。


私はかなり困惑しています。データを読み取った後にデータをどう処理するかが問題になるというのは非常に奇妙に思えます。また、割り当てが解除されたときにバックグラウンド スレッドで何かが起こるというのは特に奇妙に思えます。

さらに奇妙なのは、この 1 つのプロパティに固有のように見えることです。たとえば、newDataJson プロパティを読み取る行のすぐ上にある id プロパティは問題を引き起こしません。id は NSData ではなく文字列であるため、それは違うと思うかもしれませんが、代わりに NSData プロパティを文字列プロパティに変換しようとしましたが、それでもエラーは変わりませんでした。

どんなアイデアでも大歓迎です。ありがとう。

編集

これが役立つかどうかはわかりませんが、これが私のモデルスキーマです

ここに画像の説明を入力

4

1 に答える 1