L'objet est désalloué mais une fois que l'objet a été placé pour conserver le compte 0, tous les appels de méthode risquent de renvoyer des valeurs périmées.
Si vous compilez et exécutez sur 32 bits, vous va obtenir une erreur (un message envoyé à retainCount objet libéré = 0x ...).
Je devine que le temps d'exécution 64 bits (option de compilation par défaut sur Leopard) ne recueille pas des objets aussi agressivement que le moteur d'exécution 32 bits afin que votre appel à
retainCount ne provoque pas une erreur.
Pour vérifier que vous objet est en effet dealloced, mettre en œuvre dealloc pour vos SampClass:
- (void) dealloc
{
NSLog(@"Dealloc");
[super dealloc];
}
modifier plus tard: Comme je le pensais, la différence de comportement entre 32 et 64 bits lors de l'appel d'une méthode sur un objet libéré provient du runtime et non un comportement indéfini. En 32 bits, une fois qu'une classe est libérée, le pointeur isa est basculé vers une classe spéciale qui permet d'intercepter les messages sur les objets libérés. Cela n'arrive pas en 64 bits. source pertinente est objc-class.m:
#if !__OBJC2__
// only clobber isa for non-gc
anObject->isa = _objc_getFreedObjectClass();
#endif
Si 'release' était implémenté de cette façon,' obj' pourrait être désalloué plus d'une fois. – mouviciel
@mouviciel uniquement si vous lui envoyez trop de messages, ce qui n'est pas le cas (sans tenir compte des problèmes de multithreading). J'essayais juste d'expliquer pourquoi l'exemple de SVA imprime 1. Mais comme l'objet est désalloué, il n'est pas vraiment possible de supposer quoi que ce soit sur son contenu. –