Members of subclass not initiali

2021-08-18  本文已影响0人  幸运者_Lucky

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

上一篇下一篇

猜你喜欢

热点阅读