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文件)。 它是公共类变量的实现。