Swift结构和Objective-C结构有什么区别?

时间:2019-03-17 23:48:26

标签: objective-c swift struct

在我的第一次面试中,我被问到Swift结构和Objective-C结构之间有什么区别。

有人能深入解释这种区别吗?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:5)

Objective-C结构是C结构,而C结构只是具有由struct属性定义的偏移量的内存块。因此,如果一个结构具有三个int属性x,y,z,我们知道x只是“结构开始”的别名,y只是“开始之后那么多字节的别名” ,而z只是“结构开始之后的其他一些字节数”的别名。如果C结构是本地(自动)变量,则可以将其存储在堆栈中,也可以通过调用malloc并使用结构指针引用该内存来将其存储在堆中。 C结构是非常原始的类型。同样,ObjC结构只是C结构。没有区别(实际上,这就是您can't put ARC-managed objects into a struct的原因;它们只是 C结构,而ARC无法处理。)

Swift结构是完全不同的野兽。它们通常仍在堆栈或堆上实现为内存块,这些内存具有偏移到内存块中的属性,但这主要只是实现细节。 Swift结构是丰富的类型,可以具有方法,扩展名,符合协议以及大多数其他可能期望使用类型丰富的语言的高级类型的东西。

最重要的是,Swift结构不仅仅是像C结构那样的“内存双关语”。您可以将不同的C结构指向相同的内存,并以不同的方式读取它(当然,工会可以做到这一点,但是您也可以直接对结构进行操作)。没有规则规定底层存储块的大小必须与C中的结构大小相同(例如objc_object的工作方式)。但是Swift结构不允许这种内存别名。他们直接拥有自己的记忆。如果您想弄乱它们的内部存储器,则必须通过某种“不安全”的界面。您不能只将4加到一个指针上,就可以像C结构那样获取其中的任何值。

由于所有这些,您可以将ARC管理的对象存储在Swift结构中(实际上,这始终在stdlib中完成)。

是的,尽管名字相同,生物却完全不同。真正相同的一件事是它们都是具有属性的值类型。

相关问题