1

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

@interface MyClass : NSObject

+ (MyClass *)sharedInstance;

@end

@implementation MyClass

+ (MyClass *)sharedInstance
{
    static MyClass * inst;
    if (!inst)
        inst = [MyClass new];
    return inst;
}

@end

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

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

4

2 回答 2

6

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

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;
}

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

于 2013-02-11T02:45:49.317 回答
1

它在技术上并不构成泄漏,因为您仍然有对内存的引用(静态的)。在您设置 inst = nil 之前,内存将一直被占用。最佳做法是在您知道已完成使用该对象时执行此操作。

于 2013-02-11T02:46:44.373 回答