1

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

宣言... ....

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

4 回答 4

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 的优势。

于 2012-05-21T08:26:50.273 回答
1

我建议在你的单例中创建一个额外的类方法:

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

+ (void)releaseSharedInstance {
  [classObject release];
  classObject = nil;
}
于 2012-05-21T09:10:40.503 回答
0

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

[[YourClass instance] release];
于 2012-05-21T08:05:23.310 回答
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();
}
于 2012-05-21T09:43:28.590 回答