2010-08-06 4 views
2

Si je crée une classe simple comme celui-ciLorsque dealloc est appelé objectif-c

@interface table : NSObject { 

    NSMutableArray *array; 
} 

@end 

et dans la méthode Init j'appelle: array = [[NSMUtableArray alloc] init]; et dans la méthode dealloc j'appelle: [array release];

mais J'ai un poireau mémoire car la méthode dealloc n'est jamais appelée. Je dois appeler la méthode dealloc par moi-même?

Répondre

0

Lorsque le nombre de retenues d'un objet atteint 0, il est marqué par le temps d'exécution du nettoyage. Lorsque le temps d'exécution nettoie l'objet et récupère la mémoire, dealloc est appelé en lui donnant une chance de nettoyer toute autre référence d'objet à des variables d'instance ou similaire. Est ce que ça aide? Si vous voulez le voir appelé, mettre

NSLog(@"%s", _cmd); 

ou un point de rupture au début de votre méthode dealloc et regarder le débogueur/console.

+0

le programme ne va pas dans la méthode dealloc si je mets un breakPoint. Ma classe est un singleton, ça peut changer quelque chose? – alex

0

Non. Vous ne devez jamais appeler directement [self dealloc]. Qu'est-ce qui vous donne l'impression que -dealloc n'est jamais appelé?

EDIT: Vous ne devriez jamais avoir besoin d'appeler [table dealloc] non plus. La seule fois où vous devriez envoyer un message dealloc est en remplaçant dealloc et en appelant [super dealloc].

+0

Parce que je cours avec les outils de poireau, et il a dit que ce poireau de table, et j'ai mis un breakpoint dans la méthode dealloc et il n'est jamais appelé ... – alex

+2

Alors la question principale est "quand appelez-vous [myTable release ]? " –

0

Tout semble correct. Votre instance de la classe table ici, aura sa méthode dealloc appelée lorsqu'elle sera complètement libérée. Vous avez donc une fuite uniquement si la manière dont vous utilisez votre classe provoque une fuite de l'instance entière de table. Mais, bien sûr, les mêmes règles s'appliquent aux classes qui utilisent votre classe table.

Questions connexes