Objective-c - Les variables d'un objet Objective-c sont-elles accessibles après sa publication ?
大家讲道理
大家讲道理 2017-05-02 09:24:08
0
1
618

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 :

  1. Pourquoi puis-je continuer à y accéder après [p release] et aucune erreur n'est signalée ?

  2. 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 ?

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

répondre à tous(1)
Peter_Zhu

É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]; // 一定要有
}
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal