2010-10-28 4 views
2

D'habitude, j'écrire mon dealloc pour ressembler à ceci:Utilisation de soi sur iVars dans dealloc?

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

Mais aujourd'hui, je dactylographiées (voir ci-dessous) et était un peu perplexe pourquoi je suis une erreur en cours d'exécution du code par l'analyseur statique clang. Comme je le disais, je ne m'y ajoute généralement pas à iVars dans dealloc, mais j'étais juste un peu curieux quand j'ai vu ça comme ce qui se passait.

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

gary.

Répondre

1

Parce que c'est vraiment une mauvaise forme, et va à l'encontre de la façon dont vous devriez faire les choses. CSA ne vérifie pas seulement les erreurs sémantiques, elle vérifie également que vous faites les choses comme vous le devriez. Où vous devriez être, est la façon dont les choses sont faites dans la documentation.

+0

Je suis seulement nouveau à l'objectif-c mais à mon avis les deux libèrent [self selfList]; et [version de coffeeList]; semblerait être le même. Bien qu'il semblerait que la syntaxe confonde LLVM 1.5 CLANG. – fuzzygoat

+0

Ce ne sont pas les mêmes. Les règles de gestion de la mémoire vous indiquent de ne libérer que les objets que vous possédez. Qu'est-ce qui se passe ici, c'est '[self coffeeList]' possède 'coffeeList', pas vous. Qu'est-ce qu'il implémente est fondamentalement ceci: 'retour [[coffeeList] autorelease];' qui si vous connaissez vos règles, signifie qu'il possède coffeeList, et sera libéré à un point arbitraire à l'avenir. Vous devez libérer l'ivar lui-même * directement *. – jer

+0

Merci, juste ce que j'étais après, je voulais comprendre ce qui se passait, et maintenant je le fais. Très apprécié ... – fuzzygoat

4

Je devine juste que les notices [self something] release (ou [self.something release]) vont à l'encontre des conventions de gestion de mémoire. Un objet renvoyé à partir d'une méthode ne comportant pas de "nouveau", "init" ou "copy" dans son nom doit être auto-libéré. ​​Par conséquent, le relâcher semblerait être une erreur de sur-libération.

0

Est-ce que coffeeList est déclaré comme une propriété (et défini pour conserver)? Alors vous devriez probablement faire:

[self.coffeeList release]; 
+2

[release self.coffeeList] et [[self coffeeList]] sont exactement le même appel. – gcamp

+0

c'est oui .... @property (nonatomic, retenez) NSArray * coffeeList; – fuzzygoat

+2

Faites-le 'self.coffeeList = nil;' à la place. Assurez-vous d'enlever d'abord les observateurs sur 'coffeeList' s'il y en a, sinon ils seraient appelés pour un objet qui s'en va. – Michal