2012-05-21 31 views
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引用。

我的做法....

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

-(void) releaseObject { 

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

} 

这是好主意的dealloc这个对象?我的问题是,我不必dealloc对象,直到应用程序未被关闭。

回答

1

我建议你做一个额外的类方法在单:

​​
0

如果你的类是单,在AppDelegete的dealloc就叫

[[YourClass instance] release]; 
+0

作为结构它具有singletone的概念,但它并不完全由类名和实例调用。当我们在模拟器中停止应用程序时,是不是在apdelegate.mm中调用dealloc? –

+0

应用程序终止时 - 操作系统完全释放分配的内存。 – Moonkid

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

+0

它是内存泄漏的原因,因为我在每个类中分配对象,但在运行时会知道它是否应该分配对象或返回以前存储的引用。 –

+0

@Ajay_Kumar:从技术上讲,这是一次泄漏,实际上并不是因为当进程终止时,单身人士将与其他所有事物一起被回收。不过,您需要在'init'方法的其他部分释放'self'。 – JeremyP

0

这里是通过目标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(); 
}