我测试了一些 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 类:
objc_msgSend()
调用(大部分)他们的方法不是 NSObject 子类的 Swift 类:
objc_msgSend()
来调用他们的方法(默认)在 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 纵向和横向模式的尺寸调整类