【问题标题】:Swift 3: subclassing NSObject or not?Swift 3:是否继承 NSObject?
【发布时间】:2017-02-17 23:53:20
【问题描述】:

我已经阅读了一些类似 this one 的帖子,这些帖子介绍了在 Swift 中对 NSObject 进行子类化或仅拥有其原生基础 class 而没有子类化之间的区别。不过都是些老帖子了,这个话题我也不是很清楚。

什么时候应该继承NSObject?子类化和不子类化之间的实际区别是什么?目前 Swift 中的推荐是什么?

【问题讨论】:

    标签: swift class inheritance subclass nsobject


    【解决方案1】:

    Apple's documentation about NSObject 声明如下:

    NSObject 是大多数 Objective-C 类层次结构的根类。通过 NSObject,对象继承了运行时系统的基本接口以及作为 Objective-C 对象的能力。

    正如这表明的那样,您需要为代码中引入的类型的 NSObject 子类化,只要该类型的实例需要表现得像一个 Objective-C 对象(或类本身,在某些罕见的情况下) )。

    我不知道 Apple 提供了关于何时 继承suggesting reducing dynamic dispatch 或使用不依赖子类但protocol @987654324 的代码重用范例的书面指导@,即代码重用,通常更静态调度和value type 友好)。我相信可以公平地说,尽管大多数 Swift 程序员已经从 Apple 那里得到了提示,并且 Swift 语言的特性是在没有上述需求时避免引入基于 NSObject 的类型的标志。 也就是说,作为一般规则,仅当您真正需要 Objective-C 动态时才引入基于 NSObject 的类型,最常见的是当您需要与 Cocoa API 交互时(尤其是当您的代码与 UI 相关时:例如视图控制器,观看次数)。

    As pointed out in an answer to the question you link to,具有 Objective-C 风格的活力comes the performance of objc_msgSend based method dispatch。尽管 Swift 类中的方法也是虚拟的,但当您没有使用 @objc 属性显式标记方法时,编译器能够使用更快的方法调度方法——尤其是在 Whole Module Optimization is toggled on 时,在 Swift 3 中更是如此classes are not by default open for subclassing beyond the module that defines the type

    除了避免使用 NSObject,您还可以在编写 Swift 时完全避免基于类的引用类型in many cases。例如看一下上面链接的值类型 WWDC 视频,或者例如 this blog post 作为介绍。简而言之,使用值类型可以获得良好的局部推理,通常可以避免动态内存分配和引用计数开销(尽管并非普遍如此——将引用类型作为字段的结构是需要注意的)。

    【讨论】:

      【解决方案2】:

      子类 NSObject 的一个原因是如果您需要保存一些数据。 NSObject 和它所需要的一切仍然是(AFAIK)获取 NSCoding 的最简单方法,您需要将其写入文件。

      可以在herehere 找到一些见解

      【讨论】:

        【解决方案3】:

        另一个你必须继承 NSObject 的情况是你希望你的子类成为 KVO 的观察者,即

        addObserver(_ observer: NSObject, forKeyPath keyPath: String, options: NSKeyValueObservingOptions = [], context: UnsafeMutableRawPointer?)
        

        要求观察者是NSObject(或数组或集合)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-28
          • 1970-01-01
          相关资源
          最近更新 更多