Objective-C / iPhone内存管理静态变量

时间:2009-10-22 12:25:37

标签: iphone objective-c memory-management variables static

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

你不能把它放在dealloc方法中,因为虽然它可以访问静态变量,但是任何创建的实例方法都会释放getInstance。

我想可能有一个选项可以创建一个静态破坏方法,它可以手动释放内存,并且可以由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

3 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:7)

您需要查看iPhone开发中心的"Creating a Singleton",了解如何正确实施该模式。你不会释放你的单身,只是在应用程序退出时让它死掉。

另外,如果您是多线程的,您可能希望将该alloc包装在@synchronize(self){}

以下是全文:

  

某些类的基金会和   Application Kit创建单例   对象。在“严格”的实施中,   单身是唯一允许的   当前的一个类的实例   处理。但你也可以拥有更多   灵活的单例实现   工厂方法总是返回   相同的实例,但你可以   分配和初始化其他   实例.NSFileManager类适合   后一种模式,而后者   UIApplication适合前者。什么时候   你要求一个例子   UIApplication,它通过你   参考唯一的例子,   如果它分配和初始化它   还不存在。

     

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

     

创建单身人士作为唯一   允许的类实例   当前的过程,你需要有一个   实现类似于Listing   2-15。此代码执行以下操作:

     

声明你的静态实例   单例对象并将其初始化为   零。在你的类工厂方法中   这个类(命名为   “sharedInstance”或“sharedManager”),   生成类的实例但是   仅当静态实例为零时。   覆盖allocWithZone:方法   确保不是另一个实例   如果有人试图分配,则分配   并初始化你的实例   直接而不是使用类   类工厂方法。相反,只是   返回共享对象。实行   基本协议方法   copyWithZone:,release,retain,   retainCount,并自动释放来做   适当的事情,以确保单身   状态。 (最后四个   方法适用于内存管理代码,   不要垃圾收集代码。)   清单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; }
  

如果你想要一个单例实例(创建和   由班级工厂控制   方法)但也有能力   根据需要创建其他实例   通过分配和初始化,   不要覆盖allocWithZone:和   跟随它的其他方法如图所示   清单2-15。


更新:现在有一种更简单的方法来创建单身

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

  return _sharedInstance;
}

使用这种新样式,您无需担心@syncronize或覆盖内存管理方法。

答案 2 :(得分:1)

静态变量或类保留在内存中直到应用程序的生命周期

因此,如果它是UnUsed,则生成

Your_variable = nil;

同时声明使用static _datatype variable = nil; 这有助于初始化..和内存管理

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

static MyClass *myClass = nil;

@implementation MyClass

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

@end