在我的代码中,我使用一个单独的对象,如我的应用程序负载和高速缓存的图像应用程序常常需要一个中心点,所以不必在每次时间做资源密集型的存储器分配予加载的图像。

但也有内存使用量会变得激烈,我想释放缓存的图像数据,我的应用程序的执行过程中的时间。目前,我只是释放从我单身的UIImage的情况下,当我得到一个内存警告。

我然而宁愿,以便能够释放整个singleton对象。那可能吗?如果是的话,如何?

有帮助吗?

解决方案

当然是。虽然这是相当容易,相对于图像此对象的内存使用情况是可以忽略的。

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

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

    return mySingleton;
}

您只需要添加另一种你打电话时,你要毁掉它:

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

如果你保持对它的引用周围其他地方,你就会有麻烦;不这样做。如果您从多个线程访问你需要同步。否则,它是非常简单 - 吸气将重新当你下次需要它

其他提示

这里的一个单访问器我使用的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存取方法,但是这可能提前释放控制器,特别是当我有一个以上的线程和我所说的存取用于一个线程,这不是主线程的第一次。

任何对象,你创建你可以在任何时候只要松开。 (假设在创建它并设置它的属性。)

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)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top