Maison > Questions et réponses > le corps du texte
1. Lorsque ARC est désactivé, pourquoi ses variables membres peuvent-elles continuer à être accessibles après la libération active d'un objet Object-c ?
Le code est le suivant :
@interface person : NSObject
@property int a;
@end
@implementation person
@synthesize a;
- (void) dealloc
{
NSLog(@"dealloc person");
}
@end
int main()
{
person* p = [[person alloc]init];
p.a = 10;
NSLog(@"%d", p.a); //10
[p release]; // dealloc
p.a=20;
NSLog(@"%d", p.a); //20
return 0;
}
Problème :
Après avoir appelé [p release];, vous pouvez toujours accéder à la variable a de p;
Question :
Pourquoi puis-je continuer à y accéder après [p release] et aucune erreur n'est signalée ?
La suggestion est qu'il est préférable de ne pas continuer à y accéder après la sortie. Si je peux y accéder, dans quelles circonstances quelque chose se passera-t-il mal ?
天蓬老师2017-05-02 09:26:08
Étant donné que l'adresse pointée par p n'a pas changé après la publication, si le système d'exploitation n'a pas récupéré cette partie de la mémoire, aucune erreur ne sera signalée si vous continuez à y accéder, ce qui est un pointeur suspendu.
p -----------------------------------> Personne {a : 10, reference_count : 1}
p -- envoyer un message de libération à ---> Personne {a : 10, reference_count : 1}
p -----------------------------------> Personne {a : 10, reference_count : 0} (désalloué)
p --------- obtenir la valeur d'un ----> Personne {a : 10, reference_count : 0} (a vaut toujours 10)
Comme mentionné ci-dessus, si vous souhaitez que cela pose des problèmes, continuez simplement à essayer jusqu'à ce que le système d'exploitation le bloque (généralement très rapidement) :
person* p = [[person alloc]init];
p.a = 10;
NSLog(@"%d", p.a);
[p release];
do {
NSLog(@"%d", p.a);
} while (TRUE);
Vous pouvez voir si vous l'exécutez plusieurs fois, il n'y a aucun motif lorsqu'il se bloque. . . Ce n’est donc pas qu’il vaut mieux ne pas continuer à visiter, ce n’est certainement pas à continuer de visiter. . .
Je ne l'ai pas vu tout à l'heure, dealloc doit aussi être modifié :
- (void) dealloc
{
NSLog(@"dealloc person");
[super dealloc]; // 一定要有
}