3

2 つのコア データ エンティティのクラスを生成しました。1 つ目は Address と呼ばれ、抽象的なエンティティです。2 番目は Person と呼ばれ、Address から継承されます。このテストのために、管理対象属性の例をいくつか追加しました。そして、管理されていない String プロパティを Person クラスに追加しました。Person クラスの文字列プロパティにアクセスするとクラッシュします。なぜこれがクラッシュするのですか?

Address クラスと Person クラスは、追加のパラメーター let foo = "Foo" を除いて、Xcode によって自動的に生成されます。

Person が Address ではなく NSManagedObject から直接継承されるようにコードを変更すると、コードは機能し、クラッシュしません。

自動生成された Address クラス:

@objc(Address)
public class Address: NSManagedObject {
}

extension Address {
    @nonobjc public class func fetchRequest() -> NSFetchRequest<Address> {
        return NSFetchRequest<Address>(entityName: "Address")
    }
    @NSManaged public var street: String?
    @NSManaged public var city: String?
}

「foo」パラメーターを除いて、自動生成された person クラス:

@objc(Person)
public class Person: Address {
    public let foo = "Foo"  //added this parameter
}

extension Person {
    @nonobjc public class func fetchRequest() -> NSFetchRequest<Person> {
        return NSFetchRequest<Person>(entityName: "Person")
    }
    @NSManaged public var name: String?
}

問題コード

let person = Person(context: context)
print(person.foo) //doesn't crash, but prints empty line instead of value
print("VALUE:\(person.foo):") //crashes with Thread 1: EXC_BAD_ACCESS (code=1, address=0x18)

更新: foo が次のように定義されている場合

public let foo: String? = "Foo"

その場合、print ステートメントはクラッシュせず、代わりに値を「nil」と解釈して出力します。

したがって、私の質問は次のようになります。定数として割り当てられているこの値が、カバーの下で nil にリセットされるのはなぜですか?

4

1 に答える 1