2010-08-05 77 views
0

在我的代码中,我使用一个单例对象作为应用程序中的中心点来加载和缓存应用程序经常需要的图像,因此,我不必在每次加载时都进行资源密集型内存分配一个图像。单例对象内存管理

但是在我的应用程序的执行过程中,内存使用变得激烈,我想释放缓存的图像数据。目前,我只是在获取内存警告时从单例版本中释放UIImage实例。

但是,我希望能够释放整个单例对象。那可能吗?如果是这样,怎么样?

+0

如果它从网上你可以看到afnetworking uiimageview类别 – amar 2013-06-17 11:36:53

回答

2

当然是了。尽管与图像相比,此对象的内存使用率可能可以忽略不计。

通过一个单独的性质,你需要有一个访问它,在那里你将创建它,如果它当前不存在:

+ (MySingletonClass*) mySingleton 
{ 
    if (mySingleton == nil) 
    { 
     mySingleton = [[MySingletonClass alloc] init]; 
    } 

    return mySingleton; 
} 

你只需要添加另一个你打电话的时候你想要销毁它:

+ (void) destroyMySingleton 
{ 
    [mySingleton release]; 
    mySingleton = nil; 
} 

如果你在其他地方引用它,你会遇到麻烦;不要这样做。如果你从多个线程访问,你需要同步。否则,这非常简单 - 当你下一次需要它时,getter会重新创建。

+0

很酷,谢谢!你说的对于单例的内存使用量非常低,但是我发现只写''mySingleton release''而不是创建像'[mySingleton releaseImageData]'' – ryyst 2010-08-05 18:24:06

+0

@ryyst'这样的新方法就不那么容易混淆了,你仍然需要写一个新的方法 - 类'destroy'方法。我想你*可以破解它,使得'dealloc'将静态单例重置为'nil',但是这真的很糟糕。 – walkytalky 2010-08-05 18:28:49

0

您创建的任何对象都可以随时发布。 (假设你创建它并设置它的属性)。

self.myObject = [[myObjectClass alloc] init]; 
    // do something with the object 
    [self.myObject release];  // anytime that you are not using the object 

self.myObject = nil; // will also work if you've set the @property (retain, nonatomic) 
+0

你确定也适用于单身人士对象吗? – ryyst 2010-08-05 18:16:06

+0

我不是。我不明白为什么它不会,但不知道确定。 – joelm 2010-08-05 19:42:39

+0

实际上,当单身人士的对象将从内存中释放? – Bharath 2013-05-13 07:10:32

1

下面是我使用的OpenAL代码的单例访问器的示例。

// Eric Wing. Singleton accessor. This is how you should ALWAYS get 
    // a reference to the sound controller. Never init your own. 
    + (OpenALSoundController*) sharedController 
{ 
    static OpenALSoundController* shared_sound_controller; 
    @synchronized(self) 
    { 
    if (nil == shared_sound_controller) 
    { 
    shared_sound_controller = [[OpenALSoundController alloc] init]; 
    } 
    }  
    return shared_sound_controller; 
} 

OpenAL需要一段时间才能加载,所以保持一个实例正好是我所需要的。有多个线程在使用(目前不是我的情况,但我希望将我的代码移植到这种情况)我锁定了self@synchronized(self)确实如此。

现在我分配了内存,所以我负责释放它。我可以在+sharedController访问器方法中调用[shared_sound_controller autorelease],但这可能会提前释放控制器,特别是当我有多个线程时,我首次在不是主线程的线程中调用访问器。

+0

这很不错.... !!!! + 1 .. – Kamarshad 2012-07-21 08:25:53