Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.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 头文件中的变量,内存管理_Ios_Objective C_Header Files - Fatal编程技术网

Ios 头文件中的变量,内存管理

Ios 头文件中的变量,内存管理,ios,objective-c,header-files,Ios,Objective C,Header Files,在iOS中,如果我在头文件中放入一些常量变量,然后通过包含此头文件在不同的源文件中使用它们,那么这些变量的生命周期是什么?这些变量何时分配/释放?这些变量存储在哪里?您问: 这些变量的生命周期是什么 globals的生命周期就是应用程序的生命周期 这些变量何时分配/释放 在应用程序终止之前,它们不会被释放 这些变量存储在哪里 如果您谈论的是基本数据类型或字符串文字,则它们存储在专用的\u data段中,而不是堆中,也不是堆栈中 您不应该将constglobals的实现放在头中。将它们放入.m文

在iOS中,如果我在头文件中放入一些常量变量,然后通过包含此头文件在不同的源文件中使用它们,那么这些变量的生命周期是什么?这些变量何时分配/释放?这些变量存储在哪里?

您问:

这些变量的生命周期是什么

globals的生命周期就是应用程序的生命周期

这些变量何时分配/释放

在应用程序终止之前,它们不会被释放

这些变量存储在哪里

如果您谈论的是基本数据类型或字符串文字,则它们存储在专用的
\u data
段中,而不是堆中,也不是堆栈中


您不应该将
const
globals的实现放在头中。将它们放入
.m
文件中。仅将对它们的外部引用放入
.h
文件中

例如,将以下内容放入
.m
文件中:

NSString * const kNotificationName = @"com.domain.app.notification";
然后,在
.h
文件中,放入:

extern NSString * const kNotificationName;

这样,您只需实现一次,但导入该标题的任何文件都将对其具有可见性。

这两种方法之间的区别是什么?全局变量何时加载到内存中?关于这两种“方法”之间的区别,我假设您正在谈论将常量实现放在.h中,而不是放在a.m中,并且在头中只包含
extern
引用。不同之处在于,在前一种方法中,它将尝试在导入.h文件的每个.m文件中创建一个新常量(这将混淆链接器),而后一种方法表明,您只创建了一次实际常量,但提供外部引用以便任何其他编译单元都可以引用。@jokeman-Re“when”是加载到内存中的全局常量,它们是加载应用程序时加载的
\u数据
\u文本
段的一部分。它不像传统的
alloc
/
init
模式,当您在运行时遇到堆时,它会使用堆。编译器用这些常量构建一个“段”,当你的应用程序运行时,这些常量被加载到内存中。有关内存类型的更多信息,WWDC 2012是一款有趣的手表。它显示了这些常量与堆中对象的处理方式不同。@jokeman-顺便说一句,如果您想查看编译器对常量的处理方式,可以打开
.m
文件,然后选择“产品”;“执行操作”;“汇编Foo.m”。如果你不习惯看到汇编代码,这有点神秘,但是你可以搜索你的常量,你会得到一些关于这些常量在最终产品中是如何表示的见解。