シングルトンオブジェクトメモリ管理
-
26-09-2019 - |
質問
私のコードでは、アプリが頻繁に必要とする画像をロードしてキャッシュするための中心点としてシングルトン オブジェクトを使用しています。これにより、画像をロードするたびにリソースを大量に消費するメモリ割り当てを行う必要がなくなります。
しかし、アプリの実行中にメモリ使用量が激しくなる場合があり、キャッシュされた画像データを解放したいと思います。現在、メモリ警告が発生したときにシングルトンから UIImage インスタンスを解放しているだけです。
ただし、シングルトン オブジェクト全体を解放できるようにしたいと考えています。それは可能ですか?もしそうなら、どのようにして?
解決
もちろんそれはあります。それはむしろ、そう、このオブジェクトのメモリ使用量は、画像に比べてごくわずかであることですが。
シングルトンの性質によって、あなたはそれが現在存在しない場合は、あなたがそれを作成することのためにアクセサを、持っている必要があります:
+ (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)