2013-02-11 74 views
1

如果我在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,当从内存中清除类定义时调用? (这是否会发生?)

+0

这两个问题都有效地涵盖了相同的材料,但它们不是重复的,因为这个问题比另一个问题更为普遍。没有这两个问题和他们的答案(或者没有这个问题),可能并不清楚两种情况下的正确行为是相同的。 – 2013-02-11 05:02:00

回答

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

但一般来说,如果你使用的是单身人士,你可能会想要在你的应用程序的生命周期中使用它。

1

它在技术上并不构成泄漏,因为您仍然有对内存的引用(静态的)。内存将保持声明,直到您设置inst = nil。最好的做法是在知道完成使用该对象时这样做。