单例对象内存管理

时间:2010-08-05 18:08:03

标签: iphone memory-management singleton

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

但是在我的应用程序执行期间,内存使用情况变得很激烈,我想释放缓存的图像数据。目前,当我收到内存警告时,我只是从我的单例中释放UIImage实例。

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

3 个答案:

答案 0 :(得分:2)

当然是。虽然与图像相比,此对象的内存使用量很可能微不足道。

根据单身人士的性质,你需要有一个访问者,如果当前不存在你将创建它:

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

    return mySingleton;
}

你只需要添加另一个你想要销毁它的人:

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

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

答案 1 :(得分: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)正是这样做的。

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

答案 2 :(得分: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)