Вопрос

В моем коде я использую объект Singleton в качестве центральной точки в моем приложении для загрузки и кэширования изображений приложение часто требует приложения, поэтому мне не нужно делать ресурсоемкий распределение памяти каждый раз, когда я загружаю изображение.

Но в течение выполнения моего приложения есть времена, где использование памяти становится интенсивным, и я хотел бы выпустить данные кэшированного изображения. В настоящее время я просто выпускаю экземпляры Uiimage из моего синглтона, когда получаю предупреждение о памяти.

Однако я бы предпочел, чтобы иметь возможность освободить весь объект Singleton. Это возможно? Если так, как?

Это было полезно?

Решение

Конечно, это является. Хотя скорее всего, что использование памяти этого объекта незначительно по сравнению с изображениями.

По характеру синглтона, вам нужно иметь доступ к нему доступа, где вы создадите его, если он в настоящее время не существует:

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

    return mySingleton;
}

Вам просто нужно добавить другой, который вы звоните, когда хотите уничтожить его:

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

Если вы поддерживаете ссылки на это в другом месте, у вас будут проблемы; Не делай этого. Если вы получите доступ к нескольким потокам, вам нужно синхронизировать. В противном случае это довольно просто - Getter будет воссоздать, когда вам нужно будет.

Другие советы

Вот пример Singleton Accessor для Actoral Code, который я использую.

  // 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 Метод Accessior, но это может отпустить контроллер рано, особенно когда у меня есть более одного потока, и я впервые вызываю доступ к доступу, который не является основным потоком.

Любой объект, который вы создаете, вы можете просто выпустить в любое время. (Предполагается, что вы создаете его и установите его свойства.)

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