2009-10-22 26 views
12

我有一个静态方法,它创建类的一个实例并将其放入静态变量中。我想知道在这种情况下正确的内存管理方式是什么。Objective-C/iPhone内存管理静态变量

你不能把它在的dealloc法,因为它虽然可以访问静态变量,得到新版本发布也将释放sharedInstance所创建的任何实例方法。

我猜有可能是创建一个静态的破坏方法,这将manualy释放内存,并可以通过从appWillTerminate用户调用的一个选项,但似乎有点奇怪。

所以,再次,问题: 什么是释放静态变量的正确方法?


// MyClass.m 
#import "MyClass.h" 

static MyClass *myClass; // How to properly do memory management 

@implementation MyClass 

+ (MyClass *)sharedMyClass { 
    if (myClass == nil) myClass = [[MyClass alloc] init]; 
    return myClass; 
} 
@end 

回答

8

您可以不释放它们,这是正常的,因为应用程序正在关闭。 iPhone上的Cocoa已经做到了这一点,它并没有完全删除所有东西,它只是让应用程序被吹走。

或者你可以从appWillTerminate或其他一些关机功能将其删除。

+3

需要注意的是,如果你有一个单身一件事可能是一个好主意,做的是有某种清理的方法,也可以通过应用程序委托调用当它得到一个低内存警告。你甚至可以在那个时候转储整个静态对象,并且如果创建不是太昂贵的话就让它重新创建。 – 2009-10-22 16:10:32

7

你要看看"Creating a Singleton"在iPhone开发中心,了解如何正确地实现这种模式。你不会释放你的单例,只是在应用程序退出时让它死掉。

另外,如果你是多线程的,你可能会想包装在@synchronize(个体经营)即页头{}

以下是全文:

基金会的一些类和 Application Kit创建单例 对象。在“严格”实施中, 单个实例是目前 过程中一个类的唯一允许的 实例。但你也可以在 更 灵活的单执行该工厂方法总是返回 相同的实例,但你可以 分配和初始化附加 instances.The的NSFileManager类适合 后者的模式,而 的UIApplication适合前任的。当您要求 UIApplication的实例时,它会向您传递一个 对唯一实例的引用, 如果 尚不存在,则会分配并初始化它。

单体对象充当一种 控制中心,指挥或 协调 类的服务。你的类应该产生 单实例,而不是 多个实例时,有 概念上只有一个实例(如 用,例如,NSWorkspace)。您 使用单实例而不是 工厂方法或功能时,它 可以想象,有可能是 多个实例一天。

要创建一个单独作为 当前进程一类的唯一 允许的情况下,你需要有一个类似于清单 2-15的 实现。此代码执行以下操作:

声明单个对象的一个​​静态实例并将其初始化为 nil。在 的类工厂方法中,只有在静态实例为nil的情况下,该类才会生成类的实例,但会生成 类(类似于 “sharedInstance”或“sharedManager”) 。 重写allocWithZone:方法来 确保另一个实例是不是 分配,如果有人试图分配 和初始化 类的实例,而不是直接使用 类工厂方法。相反,只有 返回共享对象。执行 基本协议方法 copyWithZone:,释放,保留, retainCount,并autorelease做 适当的事情,以确保单身人士 状态。 (这些 方法的最后四个适用于内存管理代码, 不是垃圾收集代码。) 清单2-15严格执行 单身静态MyGizmoClass

*sharedGizmoManager = nil; 
+ (MyGizmoClass*)sharedManager { 
    if (sharedGizmoManager == nil) { 
     sharedGizmoManager = [[super allocWithZone:NULL] init]; 
    } 
    return sharedGizmoManager; } 
+ (id)allocWithZone:(NSZone *)zone { 
    return [[self sharedManager] retain]; } 

- (id)copyWithZone:(NSZone *)zone { 
    return self; } 

- (id)retain { 
    return self; } 

- (NSUInteger)retainCount { 
    return NSUIntegerMax; //denotes an object that cannot be released } 

- (void)release { 
    //do nothing } 

- (id)autorelease { 
    return self; } 

如果您想要一个单例实例(创建并由 方法控制的 ),但也有能力 根据需要创建其他实例 通过分配和初始化, 不覆盖allocWith Zone:和 之后的其他方法,如 清单2-15所示。


UPDATE:现在有一个更简单的方法来创建一个单独

+ (MyClass*)sharedInstance 
{ 
    static MyClass* _sharedInstance = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
    _sharedInstance = [[MyClass alloc] init]; 
    }); 

    return _sharedInstance; 
} 

使用这种新的风格,你不必担心@syncronize或重写内存管理方法。

1

静态变量或类留在你的应用程序

因此,如果未使用的内存,直到终身然后进行

Your_variable = nil; 

同时宣布使用静态_datatype变量=零; 这有助于在初始化..和内存管理

///************************** 
// MyClass.m 
#import "MyClass.h" 

static MyClass *myClass = nil; 

@implementation MyClass 

+ (MyClass *)sharedMyClass { 
    if (myClass == nil) 
      myClass = [[MyClass alloc] init]; 
    return myClass; 
} 

@end