我有一个单例类,它在整个项目中只有一次分配对象。下面的代码行很少..
...声明 ....
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];
}
这个好主意是否解除了这个对象?我的问题是,在应用程序未关闭之前,我不需要释放对象。
答案 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();
}