如何dealloc并重新初始化单例类?

时间:2011-06-28 06:38:12

标签: iphone objective-c xcode

是否可以释放一个类对象?

我有一个单例类“singleton.h”,它有一个实例,我们可以在任何其他视图控制器中使用它的属性。

+(singleton *)sharedMethod{
static singleton *myInstance=nil;
if(myInstance ==nil){
myInstance=[[singleton alloc] init]; myInstace.str=@"hello";
}
return myInstance;
}

我想知道的是..,有没有什么方法可以在我们的任何viewControllers中释放类对象...然后再次创建一个新的单例类的实例..,我试过这样做..,Xcode抛出一个错误“不能dealloc类对象”。

4 个答案:

答案 0 :(得分:8)

单身人士的全部意义在于你永远不会解除分配。其他类可以保护指向实例的指针,因此如果你想要替换它,你会得到奇怪的行为,甚至有时会崩溃。所以你不应该这样做。

但只要您没有覆盖releaseretainCount方法,就有可能。但是你引用的错误信息似乎表明你已经做了[MyClass release];这样的事情,当然这不起作用。

顺便说一下,你似乎有singleton作为班级名称。请尽量遵守Apple使用的编码惯例,以使您和其他人的生活更轻松。类名应始终以大写字符开头,方法名应始终以小写字符开头。

答案 1 :(得分:2)

声明

static YOUR_CLASS *shared = nil;
static dispatch_once_t oncePredicate; //very important for reinitialize.

使用实例

+ (instancetype)shared  {
    dispatch_once(&oncePredicate, ^{
        shared = [[self alloc] init];
    });
    return shared;
}

复位

+ (void)reset{
    @synchronized(self) {
        shared = nil;
        oncePredicate = 0;
    }
}
你很高兴去√

答案 2 :(得分:0)

如果你不解除 singleton 类的释放,这是非常可观的,因为在完全执行你的应用程序之前不会这样做。有关更多信息,请参阅this。要重新初始化 singleton 类,您需要像第一次那样做。

答案 3 :(得分:-1)

这个解决方案帮助了我。创建一个单独的方法来初始化类。

@implementation SomeManager

static id sharedManager = nil;

+ (void)initialize {
    if (self == [SomeManager class]) {
        sharedManager = [[self alloc] init];
    }
}

+ (id)sharedManager {
    return sharedManager;
}

@end

来源:http://eschatologist.net/blog/?p=178