2009-09-22 10 views
1

Dans tableView: cellForRowAtIndexPath:Pourquoi - [NSObject retainCount] renvoie-t-il parfois des valeurs inattendues?

// Make a cell: 
UITableViewCell *cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero  reuseIdentifier:@"Default"] autorelease]; 

// Make a spinner: 
UIActivityIndicatorView *spin = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; 
// [spin retainCount] = 1 

// Start spinning 
[spin startAnimating]; 

[cell.contentView insertSubview:spin atIndex:0]; 
// [spin retainCount] = 3. Huh? 
// I would have expected it to be 2 at this point. 

[spin release]; 
// [[cell.contentView.subviews objectAtIndex:0] retainCount] = 2 

À ce stade, je l'aurais pensé cell.contentView.subview est l'objet unique avec un conserver sur la fileuse. Mais il est clair qu'un nombre de retenue de 2 indique que quelque chose d'autre le retient également. Est-ce que quelqu'un pourrait m'expliquer s'il vous plaît qui est l'objet mystérieux qui a une retenue sur le spinner en dehors du tableau de subview de cell.contentView?

Cheers,

Doug

Répondre

3

L'objet mystère qui retient votre spinner (et bien d'autres encore des objets) est appelé NSAutoreleasePool.

Dans Cocoa, il est tout à fait inutile de regarder un objet retainCount, car vous ne pouvez pas savoir si l'objet a été auto-libéré avant (souvent plusieurs fois). Le retainCount ne décrémente que lorsque le pool actuel est drainé, généralement après le prochain passage dans la boucle d'exécution. Si vous ne retenez pas l'objet, il sera supprimé lorsque la piscine sera vidée.

Encore une fois, la règle de base est la suivante: Ne regardez pas le retainCount.

S'il y avait une méthode autoreleaseCount il serait possible de calculer la « logique » de conserver le nombre, mais je crains les ingénieurs d'Apple laissâmes, comme un exercice pour commencer les développeurs Cocoa;)

+0

En fait, pour les objets que je » Je ne suis pas autoreleasing, retainCount n'a jamais été mal pour moi. Je l'ai utilisé fréquemment et de manière fiable. Je ne suis pas sûr d'être d'accord avec votre évaluation dans le cas général, mais dans ce cas particulier, je pense que vous avez probablement raison. UITableView et UITableViewCell se mettent à toutes sortes de trucs sous le capot. – dugla

+1

Vous ne devez pas auto-libérer les objets vous-même, il peut s'agir d'un code qui n'est pas sous votre contrôle. Cocoa et Cocoa-Touch utilisent partout des objets auto-libérés. Par exemple, les getters synthétisés de propriétés (atomiques, retenues) font ceci pour assurer que les objets sont vivants quand le getter revient. Et il y a d'autres endroits dont je suis sûr que vous n'êtes pas au courant. –

Questions connexes