如果我在.m文件中声明了一个类变量(与实例变量相反)并由一个setter和getter访问它,例如[MyClass setValue],[MyClass Value]
什么时候分配该可变内存,什么时候释放?
我从上一个问题想到的只是一个新问题:How to store relatively static but configurable information
最佳答案
假设您将类变量实现为具有文件范围的变量(全局变量),即在函数或方法外部声明的变量,例如:
#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文件)可见。这是 private 类变量的实现。否则,与第一个示例一样,该变量被称为具有外部链接,并且可以由其他翻译单元(其他实现,.m文件)访问。这是 public 类变量的实现。
关于iphone - Objective-C中的类变量内存生命周期,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5839247/