我已经读过类似这样的文章,其中介绍了NSObject在Swift中进行子类化或仅具有其本机基础class而不进行子类化的区别。但是它们都有些过时,我对此主题尚不清楚。
NSObject
class
什么时候应该继承NSObject?子类化与不子类化之间的实际区别是什么?Swift中的建议是什么?
苹果公司有关NSObject的文档介绍如下:
NSObject是大多数Objective-C类层次结构的根类。通过NSObject,对象继承了运行时系统的基本接口,并具有充当Objective- C对象的功能。
因为这将意味着,你 需要 子类NSObject的代码中的引入类型每当这种类型的需求情况表现得像一个Objective- C对象(或类本身,在某些罕见的情况下)。
除了不建议减少动态分派或使用不依赖于子类而是协议扩展的代码重用范式(减少代码的重用范式)外,我不知道苹果公司是否提供了关于何时 不 继承NSObject的书面指导,即代码重用通常更具静态的派生和价值。类型友好)。我相信可以公平地说,尽管大多数Swift程序员都从Apple那里获得了一些提示,而Swift语言功能是避免在上述需求不存在时避免引入基于NSObject的类型的标志。 也就是说,通常来说,仅在您真正需要Objective- C动态性时才引入基于NSObject的类型,最常见的是您需要与Cocoa API交互时(尤其是与UI相关的代码时尤其常见:例如,视图控制器,视图)。
正如您所链接的问题的答案中指出的那样,Objective- C风格的动态性带来了objc_msgSend基于方法的调度的性能。尽管Swift类中的方法也是虚拟的,但是当您不显式标记带有@objc属性的方法时,编译器可以使用更快的方法来调度方法- 尤其是在“ 启用整个模块优化”功能时,尤其是在Swift 3中,默认情况下,在定义类型的模块以外的子类中,不打开类。
objc_msgSend
@objc
除了避免使用NSObject,在编写Swift时,在许多情况下还可以完全避免基于类的引用类型。例如,查看上面链接的WWDC视频的值类型,或以本博客文章作为介绍。简而言之,使用值类型可以获得良好的局部推理,通常会避免动态内存分配和引用计数开销(尽管并非普遍如此- 将引用类型的结构作为字段来说明)。