当前位置: 首页 > 面试题库 >

Swift 3:是否继承NSObject?

东方方伟
2023-03-14
问题内容

我已经读过类似这样的文章,其中介绍了NSObject在Swift中进行子类化或仅具有其本机基础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中,默认情况下,在html" target="_blank">定义类型的模块以外的子类中,不打开类。

除了避免使用NSObject,在编写Swift时,在许多情况下还可以完全避免基于类的引用类型。例如,查看上面链接的WWDC视频的值类型,或以本博客文章作为介绍。简而言之,使用值类型可以获得良好的局部推理,通常会避免动态内存分配和引用计数开销(尽管并非普遍如此-
将引用类型的结构作为字段来说明)。



 类似资料:
  • 问题内容: 伙计们,我们是像其他任何类一样从Object继承的(当然,我们不必明确声明除外)还是对Object类有一些特殊的特权,并且它不像其他类那样继承? 问题答案: 不,是一样的。这是JLS 8.1.3 的摘录: 如果任何其他类的类声明都没有extends子句,则该类会将其作为其隐式直接超类。 当然,它本身有点特殊(JLS): 每个类都只是单个现有类(第8.1.3节)的扩展(即其子类),并且可

  • 快速提问,我正在学习接口和继承。 这不是实际的代码,只是一个例子。假设我有抽象类“动物”。对马和犬类等组有一些继承。还有一个接口“宠物”。它将用于动物的不同子类。犬类“狗”的子类实现了接口“宠物”。因此“狗”的所有子类也实现了接口“宠物”,而不必在“狗”的每个子类上单独实现“宠物”,对吗?

  • 问题内容: 偏重于继承而不是继承 是非常流行的短语。我读了几篇文章,最后每篇文章都说 当类之间存在纯IS-A关系时,请使用继承。 本文中的一个示例: 在 Apple 和 Fruit 之间存在明显的IS-A关系,即Apple IS-A Fruit,但作者也将其显示为Apple HAS-A Fruit(组成),以显示通过继承实现时的陷阱。 我在这里变得有些困惑,声明的含义是什么 当类之间存在纯IS-A

  • 问题内容: 我已经读过1000多个位置,这些位置不继承静态变量。但是,这段代码如何正常工作? Parent.java Child.java 此代码显示“父母”。 还阅读了一些隐藏数据的概念。 Parent.java Child.java 现在输出为“ Child”。 那么这是否意味着 静态变量被继承,但是它们遵循数据隐藏的概念 ? 问题答案: 请查看oracle的文档:http : //docs.

  • 我有一个注释和三个类,像这样: 有没有办法确定当前注释是直接在类中继承还是声明的? 类似于方法<代码>公共布尔值的东西是默认的(类 导出输出:

  • 问题内容: 我正在阅读Khalid Mughal 撰写的Java™SCJP认证程序员指南。 在“继承”一章中,它说明了 成员的继承与声明的可访问性紧密相关。如果超类成员可以通过子类中的简单名称来访问(不使用任何其他语法,如super),则该成员被视为继承的 它还提到静态方法不是继承的。但是下面的代码完全可以: 我如何直接在课堂上使用?甚至更多,也可以。 这本书的解释仅适用于实例方法吗? 问题答案: