objective-c - Swift native 基类或 NSObject

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

在没有 Cocoa/NSObject 基类的情况下定义 Swift 类是否正常?如果我担心这意味着放弃了 Objective-C 的大部分动态,例如方法拦截和运行时自省(introspection)。

动态运行时行为是属性观察器、Core Data、Aspect Oriented Programming 等功能的核心。 , Higher Order Messaging 、分析和日志框架等。

使用 Objective-C 的方法调用风格会在方法调用中添加大约 20 个机器代码操作数,因此在某些情况下(对具有小主体的方法的许多紧密调用)C++ 风格的静态和 vtable 调度可以表现更好。

但是考虑到一般的 95-5 规则(95% 的性能提升来自调整 5% 的代码),从强大的动态特性开始并强化 where 是否有意义?必要的?

最佳答案

作为 NSObject 子类的 Swift 类:

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

不是 NSObject 子类的 Swift 类:

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

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

编辑:

在 Xcode 6 beta 6 中,动态属性出现了。这允许我们指示 Swift 方法应该使用动态调度,因此将支持拦截。

public dynamic func foobar() -> AnyObject {
}

关于objective-c - Swift native 基类或 NSObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24057525/

相关文章:

objective-c - 如何删除 MKMapView 上的所有注释

objective-c - 获取对 iOS 应用程序中最顶层 View /窗口的引用

objective-c - 抑制警告 "Category is implementing a met

objective-c - IOS:创建带有圆角的 UIImage 或 UIImageView

iphone - 如何从 UITableViewCell 获取 UITableView?

ios - 如何防止 UINavigationBar 在 iOS 7 中覆盖 View 顶部?

objective-c - iPad 纵向和横向模式的尺寸调整类

objective-c - 更改 UIButton 文本

iphone - 如何获得精确的时间,例如在 Objective-C 中以毫秒为单位?

ios - 了解 NSRunLoop