自我释放,释放实际对象?

时间:2012-05-21 08:02:15

标签: iphone objective-c ios singleton

我有一个单例类,它在整个项目中只有一次分配对象。下面的代码行很少..

...声明 ....

MyClassName *classObject = nil

在init方法中,代码如下所示..

-(id) init(){
    self = [super init];

    if(classObject == nil){

        1. Allocate object code here
        2. classObject = self;
        3. return classObject
     } else {
        return classObject;
     }
}

但我的问题是我将如何释放这个对象。我从所有类调用此init方法,并且每次都返回classObject引用。

我的方法......

从appdelegate.m中的dealloc方法,我调用了一个在MyClassName中定义的函数(releaseObject)。这是函数体的定义......

 -(void) releaseObject {

    [self release]; // Confusion: Will it dealloc classObject reference?
    [super release];

}

这个好主意是否解除了这个对象?我的问题是,在应用程序未关闭之前,我不需要释放对象。

4 个答案:

答案 0 :(得分:3)

答案是不要打扰释放单身人士。无论如何,它应该持续应用程序的生命周期,并且在进程终止时将自动与其他所有内容一起消失。您可能会发现应用程序委托上的dealloc方法由于同样的原因从未被调用。

如果您已完成关闭应用程序的清理工作,最好将其移至单独的方法中,并在应用程序即将终止时调用它。


单例IMO的一个更简单的模式是有一个类方法来返回单例实例,而不是在init中释放东西。

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

以上使用dispatch_once来确保初始化块仅在应用程序的生命周期中发生一次。您仍然可以通过直接调用init来创建其他实例,但这是有利的IMO。

答案 1 :(得分:1)

我建议在你的单身人士中制作一个额外的课程方法:

static MyClassName *classObject = nil;
...
+ (MyClassName *)sharedInstance {
...
}

+ (void)releaseSharedInstance {
  [classObject release];
  classObject = nil;
}

答案 2 :(得分:0)

如果您的班级是单身人士,请在AppDelegete dealloc中调用

[[YourClass instance] release];

答案 3 :(得分:0)

以下是通过Objective C ++的解决方法:

class StaticOwner {
private:
    id<NSObject> object;
public: 
    StaticOwner(id<NSObject> obj) { object = [obj retain];  }
    ~StaticOwner() { [object release]; }
    id<NSObject> instance() {return object;}
};

用法示例:

+ (MySingleton*) sharedInstance {
    static StaticOwner owner = StaticOwner([[[MySingleton alloc] init] autorelease]);
    return owner.instance();
}