我测试了一些用Swift编写的isa,发现它仅在NSObject是超类(直接或更高级)或使用’@objc’装饰时才有效。否则,它将遵循静态和vtable- dispatch样式,例如C ++。
定义没有Cocoa / NSObject基类的Swift类是否正常?如果我担心的话,这意味着要放弃Objective- C的大部分活力,例如方法拦截和运行时自省。
动态运行时行为位于属性观察器,核心数据,面向方面的编程,高阶消息传递,分析和日志记录框架等功能的核心。
使用Objective-C的方法调用样式会将大约20个机器代码操作数添加到方法调用中,因此在某些情况下( 对带有小 实体的 方法进行许多紧密调用 ),C ++样式的静态和vtable分配可以更好地执行。
但是考虑到一般的95-5规则( 95%的性能提高来自调整5%的代码 ),从强大的动态功能入手并在必要时进行强化是否有意义?
Swift类是NSObject的子类:
objc_msgSend()
不是NSObject子类的Swift类:
在Swift中对NSObject进行子类化可以为您提供Objective-C运行时的灵活性,同时也为您提供Objective- C的性能。如果不需要Objective-C的灵活性,避免使用NSObject可以提高性能。
编辑:
对于Xcode 6 beta 6,将显示动态属性。这使我们可以指示Swift某个方法应使用动态分配,因此将支持拦截。
public dynamic func foobar() -> AnyObject { }