2010-06-24 5 views
1

Quelle est la bonne façon de faire cela?iphone - ne fuit pas

J'ai un tableau que je vais utiliser sur plusieurs méthodes. J'ajouter des objets, obtenir des valeurs, remplacer les valeurs, etc.

Aujourd'hui, je fais ceci:

Je déclare sur .h, en utilisant quelque chose comme

NSMutableArray *myArray; 

dès que l'application commence, je déclare sur .m faire quelque chose comme

myArray = [[[NSArray alloc] init] retain]; 

Si je ne fais pas le conserver le tableau sera publié à un moment donné et l'application se bloque. Mais allouer le tableau au début de l'application et le laisser "ouvert" sans le relâcher fera pleurer les instruments, pointant le doigt sur moi, m'appelant un "leaker" ...

Comment résoudre ce problème? Est-ce la bonne façon de faire cela? comment faites-vous les gars comme ça?

grâce

Répondre

3

alloc définit implicitement Retain nombre à 1. En envoyant le message de vous retain incrémenter le compte Retain 2. Pour que l'objet à désalloué vous devrez alors relâcher deux fois. Ne pas le faire entraînerait une fuite de mémoire.

Idéalement, vous devez créer l'objet dans votre méthode init à l'aide [[NSArray alloc] init] puis relâchez-le dans votre méthode dealloc comme ceci:

- (void)dealloc { 
    [myArray release]; 
    [super dealloc]; 
} 

Vous pouvez également trouver cet article utile: http://developer.apple.com/mac/library/documentation/cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html

Une chose : Vous avez déclaré myArray comme NSMutableArray mais l'avez instancié comme NSArray. Peut-être que cela cause le crash.

+0

merci mais dites-moi ceci: suis-je commettre une hérésie pour déclarer le tableau au début de l'application et le libérer sur la méthode dealloc? Comment ne puis-je pas conserver? Si je ne le fais pas le tableau sera invalide et l'application va planter. J'ai essayé d'enlever le retenir, mais l'application se bloque. – SpaceDog

+1

Vous devez le libérer ailleurs dans votre code. Assurez-vous que la seule instance de '[myArray release]' dans votre code est dans votre méthode 'dealloc'. – robinjam

2

Vous ne devriez pas conserver l'objet que vous venez de créer. Vous le possédez déjà. Si, comme vous le dites, "le tableau sera publié à un moment donné et l'application tombera en panne", c'est le code que vous devriez changer. Votre code ne devrait pas libérer un objet que vous voulez conserver.

+0

merci !!!!!!!!!!! – SpaceDog