我用Swift测试了大约isa swizzling个,发现只有当NSObject是一个超级类(直接或更高级)或使用"@objc"装饰时,它才有效.否则,它将遵循一个静态和可调度的调度方式,如C++.

定义一个没有Cocoa/NSObject基类的Swift类正常吗?如果我担心的话,这意味着要放弃Objective-C的许多动态功能,比如方法拦截和运行时内省.

动态运行时行为是特性的核心,如属性观察者、核心数据、Aspect Oriented ProgrammingHigher Order Messaging、分析和;日志(log)框架等等.

使用Objto-C的方法调用样式,可以将20个机器代码操作数添加到方法调用中,因此在某些情况下(many tight calls to methods with small bodies)C++风格的静态和VTABLE调度可以执行得更好.

但是考虑到一般的95-5规则(95% of performance gains come from tuning 5% of the code),从强大的动态特性开始,并在必要时进行强化难道不合理吗?

推荐答案

作为NSObject子类的Swift类:

  • 是Objective-C类本身吗
  • 使用objc_msgSend()来调用(大多数)他们的方法
  • 为(大多数)方法实现提供Objective-C运行时元数据

非NSObject子类的Swift类:

  • 都是Objective-C类,但只实现了少数几个与NSObject兼容的方法
  • 不要使用objc_msgSend()来调用它们的方法(默认情况下)
  • 不要为其方法实现提供Objective-C运行时元数据(默认情况下)

在Swift中对NSObject进行子类化,不仅可以提高Objective-C运行时的灵活性,还可以提高Objective-C性能.如果不需要Objective-C的灵活性,避免NSObject可以提高性能.

Edit:

在Xcode 6 beta 6中,会出现动态属性.这使我们能够指示Swift方法应使用动态调度,因此将支持拦截.

public dynamic func foobar() -> AnyObject {
}

Swift相关问答推荐

如何将EnvironmentObject从UIKit视图控制器传递到SwiftUI视图

按Esc键时执行操作(工作表)

如何将CodingKeys作为数组而不是枚举传递到类外部的函数中?

SwiftUI map 旋转

如何使用可搜索在搜索栏中搜索包括>或<?

使用 swift 的 Firebase 身份验证

Swift Random Float Fatal Error:在无限范围内没有均匀分布

如何在不将变量转换为字符串的情况下判断变量在 Swift 中是否为 Optional(nil)?

TextField 键入未完成

UUID 哈希值是不确定的吗?

签署GoogleSignIn-GoogleSignIn需要开发团队

Swift-如何接受多个(联合)类型作为参数

(SwiftLint)如果有正文,如何编写规则(可能是自定义),在{之后总是\n(换行)?

macOS 守护进程应该由Command Line ToolXcode 模板制作吗?

如何在界面生成器中创建 UILayoutGuide?

使用 phimagemanager 将图像保存到自定义相册?

将活动指示器 colored颜色 更改为黑色

强制打开已在同一行代码中 Select 性访问的变量是否安全?

将 UIImage 剪成圆形

如何在 Swift 中从字符串创建类的实例