2010-10-05 5 views
0

dire donc j'obtenir des résultats de ma demande de données de base: (ce qui est un exemple de code)Une autre question encore gestion de la mémoire iPhone

Sur un événement de presse boutonner fait:

NSMutableArray *results = [[myContext executeFetchRequest:request error:&error] mutableCopy]; 
myObject = (MyObject *)[mutableFetchResults1 objectAtIndex:0]; // assume that there's something in there 

Maintenant, je veux myObject pour rester dans mon programme pendant un certain temps ... c.-à-d., l'information contenue dans 'myObject' sera utilisée dans d'autres événements et autres. Donc je l'ai défini dans mon fichier .h.

Ma question est, comment puis-je gérer la mémoire dans ce cas. Ai-je besoin de "publier" les résultats ou myObject à un moment donné? Instruments dit que cela fuit ... Mais voyez-vous des problèmes ici?

Répondre

1

Vous pouvez juste faire l'objet retain 0 index à partir des résultats comme ceci:

myObject = [(MyObject *)[mutableFetchResults1 objectAtIndex:0] retain]; 

Et vous pouvez alors publier les résultats juste après que, myObject se traîner. Vous devrez ensuite également libérer myObject.

+0

ok, mais pourquoi ai-je besoin de publier des résultats ... ne le libère-t-il pas automatiquement (je pensais que je devrais 'libérer' si je fais un alloc ou new ou quelque chose) sinon il est autoreleased? – foreyez

+1

Vous prenez possession d'un objet si vous le créez à l'aide d'une méthode dont le nom commence par "alloc" ou "new" ou contient "copy" (par exemple, alloc, newObject ou mutableCopy) ou si vous lui envoyez un message de conservation . Voir http://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html#//apple_ref/doc/uid/20000994-BAJHFBGH –

+0

sans blague c'est ce que j'ai dit .. i demandé pourquoi je dois publier les résultats. Je n'ai pas pris possession de celui-ci. – foreyez

1

mutableCopy (et copy) renvoie un objet avec un nombre de retenues de 1 - vous êtes le propriétaire de l'objet retourné. Vous devez donc publier les résultats à un moment donné. MyObject est conservé par le tableau de résultats. vous n'avez pas besoin de le libérer explicitement car vous n'êtes pas son propriétaire.

Si vous êtes uniquement intéressé par myObject je le conserverais et publierais des résultats dès que possible.

+0

oui, je ne suis intéressé que par myObject. donc je le garde, et je publie des résultats par la suite .. MAIS j'ai encore besoin de libérer myObject! (juste comme BP a dit) .. vous dites que c'est faux de libérer myObject ?? – foreyez

+0

Veuillez ne pas dire "mutableCopy et copier retourner un objet avec un nombre de retenue de 1". Ce n'est pas nécessairement vrai. Vous devriez juste dire "vous avez la propriété de l'objet retourné et devez donc le relâcher plus tard". – JeremyP

+0

Si vous ne conservez pas myobject, vous ne devez pas le libérer. Si vous le retenez, vous devez le libérer. - c'est si simple. Ce n'est pas un cas particulier. – jsz

Questions connexes