我知道在 Swift 中不存在原语,但这是我能想到的最好的名字。
几周前我参加了一次聚会,演讲者说 Switch 语句比 If-Else 语句消耗的内存稍多。我不知道两者之间的内存消耗存在差异,如果我考虑过它,我会想到相反的情况。不管怎样,它让我开始思考我的代码。
我正在将数据从一个 vc 发送到另一个 vc,我可以通过两种不同的方式进行。
我可以将 2 个变量的值从 ClassA 发送到 ClassB
我可以创建一个具有与属性相同的 2 个变量的类或结构模型,然后将模型从 ClassA 传递到 ClassB
第一个例子:
ClassA:UIViewController{
var firstName: String?
var lastName: String?
viewDidLoad...{
self.firstName = "Veggie"
self.lastName = "Burger"
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "..."{
let classB = segue.destination...
classB.firstName = self.firstName
classB.lastName = self.lastName
}
}
ClassB:UIViewController{
var firstName: String?
var lastName: String?
viewDidLoad...{
self.firstName! ... //do something with it
self.lastName! ... //do something with it
}
}
第二个例子:
class: Person{
firstName: String?
lastName: String?
}
ClassA:UIViewController{
var person: Person?
viewDidLoad...{
self.person = Person()
self.person.firstName = "Veggie"
self.person.lastName = "Burger"
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "..."{
let classB = segue.destination...
classB.person = self.person
}
}
ClassB:UIViewController{
var person: Person?
viewDidLoad...{
self.person.firstName! ... //do something with it
self.person.lastName! ... //do something with it
}
}
我知道在第一个示例中我有 2 个不同的值位于 2 个不同的内存地址,但在第二个示例中我有 1 个值位于 1 个内存地址。我不确定它的属性是否也位于 2 个不同的内存地址或共享同一个。
第一个示例或第二个示例会占用更多内存吗?
最佳答案
对象(类的实例)有两个机器字的开销。一个指向元类对象(其中包含有关对象的实例变量、属性、方法等的所有各种信息),另一个指向对象的引用计数和其他预订保留数据。
这两个字段的开销通常不是很大。当然,如果您制作很多(100,000 个)小 object ,惩罚就会增加。如果你的对象只包含一个机器字的真实数据,但有 2 个字的开销,你只能从内存中获得 33% 的利用率。更大的问题是对象是在堆上分配的,这是一个昂贵的过程。此外,创建对对象的销毁引用需要同步修改对象引用计数。
结构体以内联方式存储它们的字段,结构体的实例存储在堆栈中。它们非常高效并且可由编译器高度优化。在大多数情况下,启用整个模块优化后,大多数结构在运行时甚至不存在,因为编译器能够直接处理其中的数据。事实上,它们非常高效,以至于您可能认为是“原始”(来自 Java 等语言)的所有内容实际上都是作为结构(或者可能是类似的 enum
)实现的。比如Int
(和(U)Int8/16/32/64
),Character
等都是结构体。
但重要的是,这些都不重要。在您确定性能问题之前,让不相关的因素支配您的代码是在浪费时间,而牺牲其他可能更重要的因素(可读性、可维护性、简洁性等)。
如果您需要重复处理成对的名字和姓氏,无论如何,请继续创建一个Person
结构来存储名字和姓氏。这就是类型的要点。让您从位和字节中脱颖而出,让您对代码的思考达到更高、更简单的层次。
我强烈建议您查看 Do iOS 2016 - Rob Napier, Once more, with types , @RobNapier 的精彩演讲
关于Swift iOS - 类对象类型是否比 "Primitive"类型消耗更多内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45594285/