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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (49)

在我的第一次面试中,我被问到Swift struct和Objective-C struct之间的区别。

任何人都可以深入解释这种差异吗?任何帮助,将不胜感激。

提问于
用户回答回答于

Objective-C结构是一个C结构,C结构只是一个内存块,具有由struct属性定义的偏移量。因此,如果一个结构有三个int属性x,y,z,我们知道x只是“结构开头”的别名,y只是“结构开始后这么多字节”的别名。和z只是“结构开始后的其他一些字节数”的别名。如果AC结构是本地(自动)变量,则可以将其存储在堆栈中,或者可以通过调用malloc并使用结构指针来引用该内存来将其存储在堆上。AC结构是一种非常原始的类型。而且,ObjC结构只是C结构。没有区别。(事实上​​,这就是为什么你不能把ARC管理的对象放到一个结构中 ; C结构,ARC无法处理。)

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

最重要的是,Swift结构不仅仅是像C结构那样的“记忆双关语”。你可以在同一个内存中指出不同的C结构,并以不同的方式读取它们(当然联合可以做到这一点,但你也可以直接使用结构)。没有规则底层内存块与C中的结构大小相同(例如,这就是objc_object的工作方式)。但Swift结构不允许这种内存别名。他们更直接地“拥有”他们的记忆。如果你想搞乱他们的内存,你必须经历某种“不安全”的界面。你不能只是向指针添加4并抓住像C结构那样的任何值。

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

所以尽管有相同的名字。真正相同的是它们都是具有属性的值类型。

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动