静态变量的Objective-C内存管理


///**************************
// MyClass.m
#import "MyClass.h"
static MyClass *myClass = NULL;
@implementation MyClass
(MyClass *)sharedMyClass {
myClass = NULL;
myClass = [[MyClass alloc] init];
return myClass;
}
@end

嗨,专家们,我只想知道myClass是一个静态的ObjC对象,当没有人再引用它时,它会被ARC自动释放,所以没有内存泄漏?它正确吗?

这里有一个singleton类实例的例子,如果需要,您可以在整个应用程序中使用它。它从未发布,也不打算发布。

@interface MyClass : NSObject
+ ( MyClass * ) singleton;
@end

这就是接口,因此您将以MyClass.singleton的形式访问它。实现是这样的。dispatch_once绒毛的原因是为了使其在可以同时从多个地方访问的环境中安全。

@implemenation MyClass ()
+ ( MyClass * ) singleton
{
static MyClass * a;
static dispatch_once_t t;

dispatch_once ( & t, ^ {

a = [[MyClass alloc] init];
} );
return a;
}
@end

请注意,这也依赖于一个静态变量。该变量从创建时起一直保留,直到永远或应用程序退出。

static MyClass *myClass创建对存储在该值中的指针的引用。只要myClass将保持有效的对象地址,该对象就不会被解除分配。基本上,这个变量将一个+1加到存储对象的引用计数上。如果您希望该对象有一个要解除分配的更改,则必须更改该变量的值以指向其他对象(或返回nil(。

附带说明一下,Objective-C中的static与类成员的静态修饰符没有关系,在C/Objective-C,static是指其他文件看不到的符号,例如Swift中的fileprivate

最新更新