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
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
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. –