Swift 项目中千万不要给 NSObject 提供默认 init 方法,父类和子类在同一module下还没有问题,当父子类在不同 module 时,就出问题了,具体参考下面代码和demo。
如下,这是个 framework,里面给 UIViewController 提供了默认实现的 public init 方法,
竟然可以不用实现这个方法,就可以直接用。编译通过,但是最后还是有问题。
public protocol Initializable {
init()
}
extension UIViewController: Initializable {}
extension UIView: Initializable {}
@available(iOS 11, *)
public class Run {
public init() { }
public func run() {
print("run")
}
}
@available(iOS 11, *)
open class Parent: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
}
required public init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
当你在主工程中,集成了这个类,并且添加了新的属性,则当访问这个属性的时候就会报野指针, 这应该是 Swift 对 NSObject 兼容有问题。
public class Child: Parent {
let a = Run()
public func run() {
a.run() /// 这里挂掉
}
}
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
Child().run()
return true
}
}
code:TestNSObjectDefautlInitCrash
reference: Members of subclass not initialized
网友评论