Ios 头文件中的变量,内存管理
在iOS中,如果我在头文件中放入一些常量变量,然后通过包含此头文件在不同的源文件中使用它们,那么这些变量的生命周期是什么?这些变量何时分配/释放?这些变量存储在哪里?您问: 这些变量的生命周期是什么 globals的生命周期就是应用程序的生命周期 这些变量何时分配/释放 在应用程序终止之前,它们不会被释放 这些变量存储在哪里 如果您谈论的是基本数据类型或字符串文字,则它们存储在专用的Ios 头文件中的变量,内存管理,ios,objective-c,header-files,Ios,Objective C,Header Files,在iOS中,如果我在头文件中放入一些常量变量,然后通过包含此头文件在不同的源文件中使用它们,那么这些变量的生命周期是什么?这些变量何时分配/释放?这些变量存储在哪里?您问: 这些变量的生命周期是什么 globals的生命周期就是应用程序的生命周期 这些变量何时分配/释放 在应用程序终止之前,它们不会被释放 这些变量存储在哪里 如果您谈论的是基本数据类型或字符串文字,则它们存储在专用的\u data段中,而不是堆中,也不是堆栈中 您不应该将constglobals的实现放在头中。将它们放入.m文
\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”。如果你不习惯看到汇编代码,这有点神秘,但是你可以搜索你的常量,你会得到一些关于这些常量在最终产品中是如何表示的见解。