当前位置: 首页 > 面试题库 >

Swift本机基类或NSObject

罗学真
2023-03-14
问题内容

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

定义没有Cocoa / NSObject基类的Swift类是否正常?如果我担心的话,这意味着要放弃Objective-
C的大部分活力,例如方法拦截和运行时自省。

动态运行时行为位于属性观察器,核心数据,面向方面的编程,高阶消息传递,分析和日志记录框架等功能的核心。

使用Objective-C的方法调用样式会将大约20个机器代码操作数添加到方法调用中,因此在某些情况下( 对带有小 实体的 方法进行许多紧密调用
),C ++样式的静态和vtable分配可以更好地执行。

但是考虑到一般的95-5规则( 95%的性能提高来自调整5%的代码 ),从强大的动态功能入手并在必要时进行强化是否有意义?


问题答案:

Swift类是NSObject的子类:

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

不是NSObject子类的Swift类:

  • 是Objective-C类,但仅实现了少数几种方法以实现NSObject兼容性
  • objc_msgSend()用于对其方法的调用(默认情况下)
  • 不为其方法实现提供Objective-C运行时元数据(默认情况下)

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

编辑:

对于Xcode 6 beta 6,将显示动态属性。这使我们可以指示Swift某个方法应使用动态分配,因此将支持拦截。

public dynamic func foobar() -> AnyObject {
}


 类似资料:
  • 在上一章节中我们已经讲到如何创建 Swift 语言的 "Hello, World!" 程序。现在我们来复习下。 如果创建的是 OS X playground 需要引入 Cocoa : import Cocoa /* 我的第一个 Swift 程序 */ var myString = "Hello, World!" print(myString) 如果我们想创建 iOS playground

  • 我试图理解与Spring数据JPA的使用。考虑以下是从表中拉出的位置。 公共接口用户存储库扩展了JpaRepository{ 一切都很好。现在,在同一个界面上,我可以添加如下方法,其中它是从中提取的,它将与实体类不匹配。 A这也很好用。现在我真正的问题是,如果实体类与无关,为什么我们需要实体类。我们只是想确保代码能够正确编译吗?这是否意味着我甚至可以将任何类放入

  • 问题内容: 是否可以更改用于构建框架的Carthage Swift版本? 我试图将我的项目迁移到Swift 3(在Xcode 8 beta上),并且第三方库是唯一阻止我的项目编译的东西。在为swift 3使用特定分支时,迦太基会抛出有关新Swift语法的错误。 任何帮助将不胜感激! 问题答案: 迦太基使用命令行工具来构建框架。命令行系统使用的Xcode版本由工具选择的值确定 它需要指向Develo

  • 向新手介绍Go语言时,解释一下Go中各种类型变量在内存中的布局通常有利于帮助他们加深理解。 先看一些基础的例子: 变量i属于类型int,在内存中用一个32位字长(word)表示。(32位内存布局方式) 变量j由于做了精确的转换,属于int32类型。尽管i和j有着相同的内存布局,但是它们属于不同的类型:赋值操作 i = j 是一种类型错误,必须写成更精确的转换方式:i = int(j)。 变量f属于

  • 基本类型   Go语言的基本类型并不多,主要有布尔类型、byte类型、rune类型、数字型和string类型。   我们在这里主要讲解布尔类型、数字型和string类型。   在具体讲解前要强调的是:Go 是强类型语言,因此不会进行隐式转换,任何不同类型之间的转换都必须显式说明。Go 不存在像 C 和 Java 那样的运算符重载,表达式的解析顺序是从左至右。还有就是,只有两个类型相同的值才可以进行

  • Object Name Description Concatenable 将类型标记为支持“串联”(通常是字符串)的mixin。 Indexable 将类型标记为支持索引操作(如数组或JSON结构)的混合。 NullType 未知类型。 TypeEngine 所有SQL数据类型的最终基类。 Variant 一种包装类型,它根据所使用的方言在各种实现中进行选择。 class sqlalchemy.t