我已经看到了在类外部创建的变量和常量的代码示例,作为避免硬编码的方法。 它们在内存分配方面是一个很好的做法吗? 例如:
private let cellId = "myCellId"
class ViewController : UIViewController {
...
let cell = tableView.dequeueReusableCellWithIdentifier(cellId)
...
}
这些常量/变量何时在iOS应用程序中分配/解除分配?
答案 0 :(得分:3)
像这样的顶级全局变量是懒洋洋地初始化的。此外,它们在dispatch_once
内隐式分配,因此它们是线程安全的。
全局变量的延迟初始化程序(也适用于结构体和枚举的静态成员)在第一次访问全局变量时运行,并作为dispatch_once启动,以确保初始化是原子的。这样就可以在代码中使用dispatch_once:只需使用初始化程序声明一个全局变量并将其标记为私有。
参考:Swift blog
答案 1 :(得分:3)
一般来说,Abizern是正确的。但是,常量字符串有点特殊情况。他们从未分配过。它们存在于二进制映像中,这是一个内存映射的,它几乎与“#34; free"你可以得到。由于结构正是它们的内容(即结构上没有标题),所以你的字符串在二进制文件中只占9个字节(字符加上尾随0)。永远不会分配;它只是。
由于cellId
是let
,编译器可以用包含数据的二进制文件中的实际内存位置替换对它的引用。甚至不需要cellId
本身的指针。