美文网首页
Members of subclass not initiali

Members of subclass not initiali

作者: 幸运者_Lucky | 来源:发表于2021-08-18 15:58 被阅读0次

    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

    相关文章

      网友评论

          本文标题:Members of subclass not initiali

          本文链接:https://www.haomeiwen.com/subject/hnfvvltx.html