Frage

In meinem Code verwende ich ein Singleton-Objekt als ein zentraler Punkt in meiner App zu laden und Cache-Bilder die App häufig benötigt, so muss ich jedes Mal, ressourcenintensive Speicherzuweisung nicht tun ich ein Bild laden.

Aber es gibt Zeiten, während der Ausführung meiner app, wo die Speichernutzung intensiver wird, und ich möchte die im Cache gespeicherten Bilddaten veröffentlichen. Derzeit bin ich nur die UIImage Instanzen von meinem Singleton freigibt, wenn ich eine Speicher Warnung.

Ich würde es vorziehen, jedoch in der Lage sein, das gesamte Singleton-Objekt freizugeben. Ist das möglich? Wenn ja, wie?

War es hilfreich?

Lösung

Natürlich ist es. Obwohl es eher wahrscheinlich, dass die Speichernutzung dieses Objekts vernachlässigbar ist im Vergleich zu den Bildern.

Durch die Art eines Singleton, die Sie benötigen dafür einen Accessor haben, wo Sie es schaffen, wenn es nicht zur Zeit nicht existiert:

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

    return mySingleton;
}

Sie müssen nur eine neue hinzufügen, dass Sie anrufen, wenn Sie es zerstören wollen:

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

Wenn Sie Verweise auf sie halten um an anderer Stelle werden Sie Schwierigkeiten haben; nicht tun. Wenn Sie von mehreren Threads zugreifen müssen Sie synchronisieren. Ansonsten ist es ziemlich einfach -. Der Getter wird neu erstellt, wenn Sie das nächste Mal auf sie

Andere Tipps

Hier ist ein Beispiel für einen Singleton Accessor für den OpenAL-Code verwende ich.

  // 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;
 }

nimmt OpenAL eine Weile zu laden, bis so eine Instanz um zu halten, ist genau das, was ich brauche. Mit mehr als einem Thread im Spiel (nicht meine Situation derzeit aber ich mein Code will Situationen portiert werden, wo dies der Fall ist) habe ich eine Sperre auf self. @synchronized(self) tut genau das.

zugewiesen Jetzt habe ich den Speicher, damit ich es für die Freigabe verantwortlich bin. Ich konnte [shared_sound_controller autorelease] im +sharedController Accessormethode nennen, aber so früh den Controller freigeben kann, vor allem, wenn ich mehr als ein Thread haben und ich die Accessor zum ersten Mal in einem Thread aufrufen, die nicht der Haupt-Thread ist.

Jedes Objekt, das Sie erstellen können Sie einfach jederzeit freigeben. (Vorausgesetzt, Sie es schaffen und es Eigenschaften eingestellt haben.)

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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top