Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/97.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 变量的内存分配&;Swift类之外的常量_Ios_Swift_Memory Management - Fatal编程技术网

Ios 变量的内存分配&;Swift类之外的常量

Ios 变量的内存分配&;Swift类之外的常量,ios,swift,memory-management,Ios,Swift,Memory Management,我见过在类之外创建变量和常量的代码示例,这是一种避免硬编码的方法。 在内存分配方面,它们是一个好的实践吗? 例如: private let cellId = "myCellId" class ViewController : UIViewController { ... let cell = tableView.dequeueReusableCellWithIdentifier(cellId) ... } 这些常量/变量何时在iOS应用程序中分配/解除分配?像这样的

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

private let cellId = "myCellId"

class ViewController : UIViewController {

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

这些常量/变量何时在iOS应用程序中分配/解除分配?

像这样的顶级全局变量是惰性初始化的。此外,它们在
dispatch\u once
中隐式分配,因此它们是线程安全的

全局变量的惰性初始值设定项(也用于结构和枚举的静态成员)在第一次访问全局变量时运行,并作为dispatch_启动一次,以确保初始化是原子的。这提供了一种在代码中一次性使用dispatch_的酷方法:只需使用初始值设定项声明一个全局变量并将其标记为private


参考:

像这样的顶级全局变量是惰性初始化的。此外,它们在
dispatch\u once
中隐式分配,因此它们是线程安全的

全局变量的惰性初始值设定项(也用于结构和枚举的静态成员)在第一次访问全局变量时运行,并作为dispatch_启动一次,以确保初始化是原子的。这提供了一种在代码中一次性使用dispatch_的酷方法:只需使用初始值设定项声明一个全局变量并将其标记为private


参考资料:

一般来说,Abizern是正确的。但是,常量字符串有点特殊。他们从未被分配。它们生活在你的二进制图像中,这是内存映射的,这是你能得到的最接近“空闲”的图像。由于结构正好是它们的内容(即结构上没有头),因此字符串在二进制中的开销正好是9个字节(字符加上尾随的0)。它从未被分配;就是这样


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

一般来说,Abizern是正确的。但是,常量字符串有点特殊。他们从未被分配。它们生活在你的二进制图像中,这是内存映射的,这是你能得到的最接近“空闲”的图像。由于结构正好是它们的内容(即结构上没有头),因此字符串在二进制中的开销正好是9个字节(字符加上尾随的0)。它从未被分配;就是这样


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

Abizern回答了第一个问题。当他们被解除分配时,答案是他们永远不会被解除分配。因此,您可能只希望在以下情况下使用此构造:(a)分配的对象不是太大(即,即使需要它的对象不再存在,您也不介意将其保留在周围);(b)你以后可能还会需要它。阿比泽恩回答了第一个问题。当他们被解除分配时,答案是他们永远不会被解除分配。因此,您可能只希望在以下情况下使用此构造:(a)分配的对象不是太大(即,即使需要它的对象不再存在,您也不介意将其保留在周围);(b)你以后可能还需要它。谢谢你的回答!这意味着我可以很好地使用字符串和数字(以及其他值类型)的这种技术在我的类文件中对常量进行软编码?您是否有任何参考资料或博客文章对此进行详细说明?再次感谢!不是所有的值类型;但至少是字符串和数字;其他一些可能也是特殊情况。编译器需要知道如何在编译时构造它们。我不确定这是如何记录的。这不是Swift的语言要求;这只是它的实现方式,并且是基于C编译器几十年来是如何做到这一点的。有点像如果你写“x=1+2”,任何现代编译语言中的每个编译器都将存储“x=3”,但我不知道任何语言规范需要它。对,这是有意义的!我想这可能也适用于核心图形框架的常量,比如
CGFloat
,甚至是结构类型,比如
CGRect
,因为它们由简单的数字数据类型组成。谢谢你的回答!这意味着我可以很好地使用字符串和数字(以及其他值类型)的这种技术在我的类文件中对常量进行软编码?您是否有任何参考资料或博客文章对此进行详细说明?再次感谢!不是所有的值类型;但至少是字符串和数字;其他一些可能也是特殊情况。编译器需要知道如何在编译时构造它们。我不确定这是如何记录的。这不是Swift的语言要求;这只是它的实现方式,并且是基于C编译器几十年来是如何做到这一点的。有点像如果你写“x=1+2”,任何现代编译语言中的每个编译器都将存储“x=3”,但我不知道任何语言规范需要它。对,这是有意义的!我想这可能也适用于核心图形框架的常量,比如
CGFloat
,甚至是
CGRect
这样的结构类型,因为它们由简单的数字数据类型组成。