2016-10-09 76 views
4

我读过this one的一些帖子,关于Swift中的子类化NSObject之间的区别,或者只是其本地基地class没有子类化。但他们都有些旧帖子,我不清楚这个话题。Swift 3:子类NSObject或不?

什么时候应该子类NSObject?子类化和非子类化之间的实际区别是什么?什么是目前在Swift中的建议?

回答

9

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作为介绍。简而言之,使用值类型可以获得良好的本地推理,通常可以避免动态内存分配和引用计数开销(尽管不是普遍适用的结构 - 引用类型作为字段是注意事项)。

1

子类NSObject的一个原因是如果你需要保存一些数据。 NSObject及其所需的全部内容(AFAIK)是您需要写入文件的NSCoding的最简单方法。

可以找到一些见解herehere