recherche

Maison  >  Questions et réponses  >  le corps du texte

Objective-c - Les variables d'un objet Objective-c sont-elles accessibles après sa publication ?

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 ?

大家讲道理大家讲道理2807 Il y a quelques jours616

répondre à tous(1)je répondrai

  • 天蓬老师

    天蓬老师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]; // 一定要有
    }

    répondre
    0
  • Annulerrépondre