objective-c中的类变量内存生命周期

如果我在.m文件中声明一个类变量(与实例变量形成对比)并通过setter和getter访问它,例如[MyClass setValue],[MyClass Value]

这个可变内存何时被分配,何时被释放?

我刚才从上一个问题中想到了一个新问题: 如何存储相对静态但可配置的信息

假设您将类变量视为具有文件范围全局变量 )的变量 ,即在函数或方法之外声明的变量,如:

#import "MyClass.h" SomeType someClassVariable; @implementation MyClass … @end 

然后该变量被称为具有静态存储持续时间。 这意味着,在程序启动之前,将分配该变量的内存并初始化该变量。 其相应的内存地址是常量,其生命周期是程序的整个执行。

如果该变量是Objective-C对象,例如

 #import "MyClass.h" NSString *someVariable; @implementation MyClass … @end 

它在程序启动之前用nil初始化。 你需要为它分配一个对象,例如在+[MyClass initialize]+[MyClass setValue:] 。 当您为其分配对象时,您必须拥有它 – 通常使用-retain-copy 。 考虑到您已经获得了已分配给变量的对象的所有权,该对象的生命周期将是程序的整个执行。

请注意,如果将另一个对象分配给该变量,则应释放前一个对象,这与实例变量的setter的标准实现非常相似。

还有一点需要注意:将类变量声明为static是很常见的:

 #import "MyClass.h" static NSString *someVariable; @implementation MyClass … @end 

通过执行此操作,您将指定它们具有内部链接,即它们仅对已声明的转换单元(实现,.m文件)可见。 它是私有类变量的实现 否则,就像在第一个例子中一样,该变量被称为具有外部链接,并且可以被其他翻译单元访问(其他实现,.m文件)。 它是公共类变量的实现