gpt4 book ai didi

objective-c - Swift native 基类或 NSObject

转载 作者:IT老高 更新时间:2023-10-28 12:21:57 28 4
gpt4 key购买 nike

我测试了一些 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com