当我尝试访问Codable
子类实例的属性并且满足以下两个条件之一时,我的应用程序崩溃:
Codable
的多级子类JSONEncoder().encode
的函数,该函数不必调用,只需要在实例化所涉及的类的地方出现即可。Entity.swift:
class Entity: Codable {
}
ChildEntity.swift:
// If ChildEntity inherits from Entity, the app will crash
/* If ChildEntity simply implements Codable like so : class ChildEntity: Codable,
the app will not crash even with the 'causesCorruptionEvenIfNotCalled' function in ChildEntityController
*/
class ChildEntity: Entity {
var name: String = ""
}
ViewController.swift:(初始视图控制器)
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let childEntity: ChildEntity = ChildEntity()
// Simply having the function 'causesCorruptionEvenIfNotCalled' in the code (not calling it) causes 'childEntity' properties to become inacessible
// Before accessing the property, 'childEntity.name' is a normal empty String
let name: String = childEntity.name // CRASH: name cannot be accessed because of a EXC_BAD_ACCESS error
// At this point 'childEntity.name' is corrupted with random data but 'name' has an empty String
// You can get get the property's value but inspecting either 'name' and 'childEntity.name' throws and EXC_BAD_ACCESS error
print("name: \(name)")
}
// Commenting or removing this function's body will prevent all the issues below
func causesCorruptionEvenIfNotCalled(object: Entity) {
let _: Data? = try? JSONEncoder().encode(object)
}
}
我有些困惑:
仅具有调用JSONEncoder().encode
的函数会导致崩溃。即使未在任何地方调用该函数。
如果您在let _: Data? = try? JSONEncoder().encode(childEntity)
初始化之后立即放置ChildEntity
,即使您让我刚才谈到的causesCorruptionEvenIfNotCalled
函数,应用也不会崩溃。 / p>
如果ChildEntity
直接继承自Codable
,那么就没有问题,应用程序也不会崩溃。
如何在通过JSON编码器保留继承结构和函数的同时防止崩溃?
这是一个示例项目:https://drive.google.com/open?id=1mrhOmm4kOAdMjLk5nlFLDeo6vTsBo1Uv
答案 0 :(得分:0)
似乎不完全支持从Codable
符合类继承。我必须重写func encode(to encoder: Encoder) throws
并在内部调用super。我以为这是默认行为,但我错了。
ChildEntity
类现在看起来像这样:
class ChildEntity: Entity {
var name: String = ""
override func encode(to encoder: Encoder) throws {
try super.encode(to: encoder)
}
}
在Swift核心代码中,它不调用超级:https://github.com/apple/swift/blob/master/stdlib/public/core/Codable.swift.gyb
该错误似乎有些相关:https://bugs.swift.org/browse/SR-4772