我已经阅读了一些像this one这样的帖子,关于Swift中子类化NSObject
之间的区别,或者只是让它的原生基础class
没有子类化。但他们都有点旧帖,我不清楚这个话题。
什么时候应该继承NSObject
?子类化和非子类化之间的实际区别是什么?目前斯威夫特的推荐是什么?
答案 0 :(得分:12)
Apple's documentation about NSObject声明以下内容:
NSObject是大多数Objective-C类层次结构的根类。通过NSObject,对象继承了运行时系统的基本接口以及表现为Objective-C对象的能力。
正如这表明的那样,只要该类型的实例需要像Objective-C对象(或类本身,在某些罕见的情况下),需要为代码中引入的类型继承NSObject )。
我不知道超级明确的Apple提供了关于不何时继承NSObject的书面指导,超出suggesting reducing dynamic dispatch或使用不依赖于子类化的代码重用范例而{{3 } protocol,即通常更静态调度和extensions友好的代码重用。我相信尽管大多数Swift程序员已经从Apple获得了提示,并且Swift语言功能作为避免在上述需求不存在的情况下引入基于NSObject的类型的标志。 也就是说,作为一般规则,当您实际需要Objective-C动态时,仅引入基于NSObject的类型,最常见的是当您需要与Cocoa API交互时(特别是当您的代码与UI相关时:例如视图控制器,视图)。强>
value type,具有Objective-C风格动态As pointed out in an answer to the question you link to。虽然Swift类中的方法也是虚拟的,但是当您没有使用@objc
属性明确标记方法时,编译器能够使用更快的方式调度方法 - 尤其是在comes the performance of objc_msgSend
based method dispatch时,甚至更多在Swift 3中Whole Module Optimization is toggled on。
除了避免使用NSObject之外,在编写Swift时,您还可以完全避免使用基于类的引用类型classes are not by default open for subclassing beyond the module that defines the type。例如,查看上面链接的值类型WWDC视频,或者例如in many cases作为介绍。简而言之,使用值类型可以获得良好的局部推理,通常可以避免动态内存分配和引用计数开销(尽管不是普遍的 - 带有引用类型的结构,因为字段是警告)。
答案 1 :(得分:1)
答案 2 :(得分:0)
必须子类addObserver(_ observer: NSObject, forKeyPath keyPath: String, options: NSKeyValueObservingOptions = [], context: UnsafeMutableRawPointer?)
的另一种情况是希望子类成为KVO的观察者,即
NSObject
要求观察者为{{1}}(或数组或集合)。