2009-02-11 6 views
3

La déclaration est:Ai-je une fuite avec cette déclaration?

//Pass the copy onto the child controller 
self.childController.theFoodFacilityCopy = [self.theFoodFacility copy]; 

Ma propriété est définie sur:

@property (nonatomic, retain) FoodFacility *theFoodFacilityCopy; 

La raison pour laquelle je pense avoir une fuite est parce que copy conserve la valeur et ma propriété de syntaxe dot conserve également la valeur . Doublement conservé.

Quelle est la manière correcte d'écrire l'instruction ci-dessus?

Répondre

9

oui, vous avez une fuite là-bas.

SomeClass *someObj = [self.theFoodFacility copy]; 
self.childController.theFoodFacilityCopy = someObj; 
[someObj release]; 

Cela reflète l'approche recommandée pour initialiser un objet aussi:

SomeClass *someObj = [[SomeClass alloc] init]; 
self.someProperty = someObj; 
[someObj release]; 

Dans les deux cas, la première ligne retourne un objet avec un compte de conserver 1, et vous le traiter de manière identique après.

+0

Vous pourriez également juste libérer si vous vouliez garder un one-liner. – Chuck

+0

En général, j'essaie d'éviter l'autorelease sauf si j'en ai vraiment besoin (comme retourner un objet d'une méthode). Les objets Autoreleased peuvent conduire à des problèmes difficiles à déboguer lorsque les choses tournent mal parce que la trace de la pile lorsqu'elle se bloque n'intersecte pas votre code du tout. J'ai été mordu par ça avant. –

+0

Merci Squeegy J'ai implémenté cette façon de faire dans mon programme. Serait-ce aussi bien? self.childController.theFoodFacilityCopy = [self.theFoodFacility copy]; [auto.childController.theFoodFacilityCopy]; Est-ce que cela réduirait le nombre de retenues de 1? ou pas .. –

0

Vous avez raison. La façon la plus propre est quelque chose comme

id temp = [self.theFoodFacitlity copy]; 
self.childController.theFoodFacilityCopy = temp; 
[temp release] 

Vous voulez lire le apple site on memory management beaucoup jusqu'à ce que ces règles deviennent une seconde nature.

6

Comme mentionné par d'autres, c'est en effet une fuite. Si vous prévoyez d'utiliser des copies de cette manière, il est probable que votre propriété devrait être déclarée copie et l'accesseur synthétisé fera le travail pour vous.

+0

C'est un excellent point aussi. Faire de la propriété utiliser la copie est de loin le moyen le plus facile si c'est une opération commune pour vous. –

0

Quel est l'avantage de le faire par rapport à la définition de la propriété?

@property (nonatomic, copy) FoodFacility *theFoodFacilityCopy; 
+0

Si c'est toujours la façon dont vous affectez l'objet, alors vous devriez le faire, oui. Mais peut-être que c'est un cas particulier. –

Questions connexes