首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Swift结构和Objective-C结构有什么不同?

Swift结构和Objective-C结构有什么不同?
EN

Stack Overflow用户
提问于 2019-03-18 07:48:26
回答 1查看 1.3K关注 0票数 1

在我的第一个工作面试中,有人问我Swift结构和Objective-C结构有什么不同。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-18 08:25:31

Objective-C结构是一个C结构,而C结构只是一个内存块,其偏移量由结构属性定义。因此,如果一个结构有三个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结构。

正因为如此,您可以在Swift结构中存储ARC管理的对象(事实上,这在stdlib中一直都是这样做的)。

所以,是的,完全不同的生物,尽管名字相同。有一点是完全相同的,那就是它们都是具有属性的值类型。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55213078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档