我读过this one的一些帖子,关于Swift中的子类化NSObject
之间的区别,或者只是其本地基地class
没有子类化。但他们都有些旧帖子,我不清楚这个话题。Swift 3:子类NSObject或不?
什么时候应该子类NSObject
?子类化和非子类化之间的实际区别是什么?什么是目前在Swift中的建议?
我读过this one的一些帖子,关于Swift中的子类化NSObject
之间的区别,或者只是其本地基地class
没有子类化。但他们都有些旧帖子,我不清楚这个话题。Swift 3:子类NSObject或不?
什么时候应该子类NSObject
?子类化和非子类化之间的实际区别是什么?什么是目前在Swift中的建议?
Apple's documentation about NSObject状态下面作一介绍:
NSObject的是根类最Objective-C类层次结构的。通过NSObject,对象继承了运行时系统的基本接口以及像Objective-C对象那样的行为能力。
。这将意味着,你需要子类NSObject的代码中的介绍,只要该类型的实例需要表现得像一个Objective-C对象(或类本身,在某些罕见的情况下)的类型。
我不知道超显苹果提供时不子类NSObject的,超越suggesting reducing dynamic dispatch或使用不依赖于子类,但protocolextensions,即代码重用通常更静态的呈现代码重用范式书面指导派遣和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作为介绍。简而言之,使用值类型可以获得良好的本地推理,通常可以避免动态内存分配和引用计数开销(尽管不是普遍适用的结构 - 引用类型作为字段是注意事项)。