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 にリセットされるのはなぜですか?