一尘不染

Swift本机基类或NSObject

swift

我测试了一些用Swift编写的isa,发现它仅在NSObject是超类(直接或更高级)或使用’@objc’装饰时才有效。否则,它将遵循静态和vtable-
dispatch样式,例如C ++。

定义没有Cocoa / NSObject基类的Swift类是否正常?如果我担心的话,这意味着要放弃Objective-
C的大部分活力,例如方法拦截和运行时自省。

动态运行时行为位于属性观察器,核心数据,面向方面的编程高阶消息传递,分析和日志记录框架等功能的核心。

使用Objective-C的方法调用样式会将大约20个机器代码操作数添加到方法调用中,因此在某些情况下( 对带有小 实体的 方法进行许多紧密调用
),C ++样式的静态和vtable分配可以更好地执行。

但是考虑到一般的95-5规则( 95%的性能提高来自调整5%的代码 ),从强大的动态功能入手并在必要时进行强化是否有意义?


阅读 267

收藏
2020-07-07

共1个答案

一尘不染

Swift类是NSObject的子类:

  • 本身就是Objective-C类
  • 使用objc_msgSend()的调用(大部分)的方法
  • 提供(大多数)方法实现的Objective-C运行时元数据

不是NSObject子类的Swift类:

  • 是Objective-C类,但仅实现了少数几种方法以实现NSObject兼容性
  • objc_msgSend()用于对其方法的调用(默认情况下)
  • 不为其方法实现提供Objective-C运行时元数据(默认情况下)

在Swift中对NSObject进行子类化可以为您提供Objective-C运行时的灵活性,同时也为您提供Objective-
C的性能。如果不需要Objective-C的灵活性,避免使用NSObject可以提高性能。

编辑:

对于Xcode 6 beta 6,将显示动态属性。这使我们可以指示Swift某个方法应使用动态分配,因此将支持拦截。

public dynamic func foobar() -> AnyObject {
}
2020-07-07