2016-08-19 78 views
0

我见过在类之外创建的变量和常量的代码示例,以避免硬编码。 在内存分配方面他们是一个很好的做法吗? 例如:内存Swift类以外的变量和常量的分配

private let cellId = "myCellId" 

class ViewController : UIViewController { 

    ... 
    let cell = tableView.dequeueReusableCellWithIdentifier(cellId) 
    ... 
} 

在iOS应用程序在这些常量/变量分配当/释放?

+1

Abizern回答了第一个问题。当他们被释放时,答案是他们永远不会被释放。所以你可能只想使用这个构造,其中(a)被分配的对象不是太大(即,即使当需要它的对象不再存在时,你也不介意保持它)。和(b)您可能稍后再需要它。 – Rob

回答

3

像这样的顶级全局变量被懒惰地初始化。此外,它们被隐式分配在dispatch_once之内,因此它们是线程安全的。

全局变量的惰性初始值设定项(也适用于结构和枚举的静态成员)在首次访问全局时运行,并作为dispatch_once启动以确保初始化是原子性的。这使得在你的代码中使用dispatch_once很酷的方式:只需用初始化程序声明一个全局变量并将其标记为私有。

参考:Swift blog

+0

非常感谢! Swift博客文章相当有用! –

2

一般来说,Abizern是正确的。但是,常量字符串有点特殊。他们从未分配。他们生活在你的二进制映像中,它是内存映射的,大概就像你可以获得的“免费”一样。由于结构正好是它们的内容(即结构中没有标题),所以你的字符串在二进制文件中只需要9个字节(字符加​​上一个尾随的0)。它从未分配;它只是。

由于cellIdlet,因此编译器可以用保存数据的二进制文件中的实际内存位置替换对其的引用。本身甚至不需要指针cellId

+0

谢谢你的回答!这意味着我可以很好地将这种技术用于字符串和数字(​​以及其他值类型),以便在我的类文件中对常量进行软编码? 你有任何参考或博客文章阐述这个?再次感谢! –

+0

不是所有的值类型;但至少是字符串和数字;其他一些可能也是特殊的。编译器需要知道如何在编译时构造它们。我不确定这是如何记录的。这不是Swift的语言要求;它是如何实现的,并且基于C编译器数十年来如何实现这一点。有点像如果你编写“x = 1 + 2”,任何现代编译语言的编译器都会存储“x = 3”,但我不知道任何需要它的语言规范。 –

+0

对,这很有道理!我想也许这可能适用于Core Graphics框架的常量,例如'CGFloat',甚至像CGREct这样的结构类型,因为它们是由简单的数字数据类型组成的。 –