在Objective-C中释放静态资源



如果我在Objective-C类中使用静态资源,我会因为不释放它而造成内存泄漏吗?类似以下内容:

@interface MyClass : NSObject
+ (MyClass *)sharedInstance;
@end
@implementation MyClass
+ (MyClass *)sharedInstance
{
    static MyClass * inst;
    if (!inst)
        inst = [MyClass new];
    return inst;
}
@end

A) 是否存在使用此类的应用程序关闭并且此静态声明造成内存泄漏的情况?

B) 当从内存中清除类定义时,是否有任何类方法(如+ (void)unloadClassDefinition)被调用?(这会发生吗?)

泄漏是指丢失了所有指针的内存块。您总是有一个指向该对象的指针,因为该变量在您的过程中存在。只要你不在不破坏旧对象的情况下将新对象重新分配给这个指针,你就永远不会有泄漏。

A) 进程的所有内存在终止时都会被回收。不存在可以持续到应用程序结束的泄漏。

B) 类在Apple的ObjC运行时中加载后永远不会卸载。

如果你想销毁这个对象,你必须将变量从该方法中移出,这样你就可以从另一个方法访问它,并按照以下方式进行操作:

static MyClass * inst;
+ (MyClass *)sharedInstance
{
    if (!inst)
        inst = [MyClass new];
    return inst;
}
// Under ARC; under MRR you might monkey around with retain and release
// This won't actually immediately destroy the instance if there are other
// strong references to it.
+ (void)destroySharedInstance
{
    inst = nil;
}

但一般来说,如果您使用的是singleton,那么您可能希望它在应用程序的整个生命周期中都存在。

从技术上讲,它并不构成泄漏,因为您仍然有对内存的引用(静态引用)。在您设置inst=nil之前,内存将一直处于声明状态。最好的做法是当你知道你已经使用完这个对象的时候就这样做。

最新更新