Управление объектом Singleton Memory
-
26-09-2019 - |
Вопрос
В моем коде я использую объект 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)