2010-08-05 2 views
0

Dans mon code, j'utilise un objet singleton comme point central de mon application pour charger et mettre en cache les images dont l'application a souvent besoin, donc je n'ai pas besoin d'allocation de ressources gourmande en ressources chaque fois que je charge une image.Gestion de la mémoire des objets Singleton

Mais il y a des moments durant l'exécution de mon application où l'utilisation de la mémoire devient intense et je voudrais libérer les données d'image en cache. Actuellement, je libère juste les instances d'UIImage de mon singleton quand je reçois un avertissement de mémoire.

Je préférerais cependant être capable de libérer l'objet singleton entier. Est-ce possible? Si c'est le cas, comment?

+0

si son site web peut regarder afnetworking catégorie uiimageview – amar

Répondre

2

Bien sûr que oui. Bien qu'il soit plutôt probable que l'utilisation de la mémoire de cet objet soit négligeable par rapport aux images.

par la nature d'un singleton, vous devez avoir un accesseur pour elle, où vous allez créer si elle n'existe pas actuellement:

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

    return mySingleton; 
} 

Vous avez juste besoin d'ajouter un autre que vous appelez lorsque vous vouloir le détruire:

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

Si vous gardez des références ailleurs, vous aurez des problèmes; Ne fais pas ça. Si vous accédez à partir de plusieurs threads, vous devrez synchroniser. Sinon, c'est assez simple - le getter va recréer quand vous en aurez besoin.

+0

Cool, merci! Vous avez raison sur l'utilisation de la mémoire singleton très faible, mais je trouve moins déroutant d'écrire simplement '[mySingleton release]' au lieu de créer une nouvelle méthode comme '[mySingleton releaseImageData]' – ryyst

+0

@ryyst Eh bien, vous avez toujours besoin écrire une nouvelle méthode - la méthode de classe 'destroy'. Je suppose que vous * pouvez * le bidouiller de telle sorte que 'dealloc' réinitialise le singleton statique à' nil', mais ce serait vraiment méchant. – walkytalky

0

Tout objet que vous créez peut être déclenché à tout moment. (En supposant que vous le créez et que vous définissez ses propriétés.)

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) 
+0

Êtes-vous sûr que cela s'applique également aux objets singleton? – ryyst

+0

Je ne suis pas. Je ne vois pas pourquoi ce ne serait pas le cas, mais je ne sais pas avec certitude. – joelm

+0

En fait, quand cet objet singleton sera libéré de la mémoire? – Bharath

1

Voici un exemple d'accesseur singleton pour le code OpenAL que j'utilise. Open12 met un certain temps à se charger, donc garder une instance autour est exactement ce dont j'ai besoin. Avec plus d'un thread en jeu (pas ma situation actuellement mais je veux que mon code soit porté vers des situations où c'est le cas) je mets un verrou sur self. @synchronized(self) fait exactement cela.

Maintenant, j'ai alloué la mémoire, donc je suis responsable de la libérer. Je pourrais appeler [shared_sound_controller autorelease] dans la méthode d'accesseur +sharedController mais ceci peut libérer le contrôleur tôt, particulièrement quand j'ai plus de un fil et j'appelle l'accesseur pour la première fois dans un fil qui n'est pas le fil principal.

+0

c'est plutôt bien .... !!!! + 1 pour ça .. – Kamarshad