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

三个关于objective-c内存管理的疑惑,希望能有人帮我解答

疑惑:
1、内存管理:dealloc之后还能打印出retainCount = 1
main方法中:

person方法中覆写的dealloc方法和打印结果

2、 两个 category都只覆写了dealloc方法,用来输出验证
Copy创建的对象release之后调用dealloc方法,但是在自动释放池释放对象时,又释放了一次
为什么会释放两次啊?

3、使用类名方法创建对象,引用计数为2

PHPzPHPz2734 Il y a quelques jours342

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

  • 阿神

    阿神2017-04-24 09:14:06

    1. La réponse aux graines de melon extraordinaires est correcte.

    2. L'appel de NSMutableArray sur l'objet copy renvoie un objet NSArray, donc lorsque [array4 release] est appelé, la méthode dealloc de array4 est appelée et NSArray dealloc est affiché.
      Ensuite, l'autoreleasepool est détruit, array3 est libéré et la méthode dealloc de array3 est appelée. Parce que [super dealloc] est appelé dans la méthode dealloc de NSMutableArray, les deux phrases suivantes sont affichées.

    3. Selon la réponse sur StackOverflow, cela est dû au fait que NSArray est un objet immuable et que ce qui est généré par [NSArray array] ou [[NSArray alloc] init] sont des tableaux vides immuables, donc Apple utilise par défaut tous les tableaux vides immuables. à une instance unique pour l'optimisation, donc avant [NSArray array], le retentionCount de cette instance est 1. Soit [NSArray array] soit [[NSArray alloc] init] dans le code augmentera le nombre de références de cette instance de tableau vide.

    Le code suivant peut refléter cela de manière plus intuitive. L'instruction a qui n'a rien à voir avec [NSArray array] augmente le nombre de références de a.

    NSArray *a = [[NSArray alloc] init];
    [NSArray array];
    [NSArray array];
    NSLog("retainCount = %ld", a.retainCount);//输出结果为4
    

    Si ARC n'est pas activé, la gestion de la mémoire doit uniquement suivre les quatre « règles d'or » des règles de base de gestion de la mémoire dans les documents Apple.

    répondre
    0
  • PHP中文网

    PHP中文网2017-04-24 09:14:06

    Répondez à la première question
    La mémoire de l'objet a été récupérée lors de la sortie.
    Lors de l'envoi d'un message retainCount à un objet qui a été recyclé, le résultat de la sortie doit être incertain. Si la mémoire occupée par l'objet est réutilisée, cela peut provoquer un crash anormal du programme.
    Pourquoi cette valeur indéterminée est-elle 1 au lieu de 0 ? Car lorsque release est exécuté pour la dernière fois, le système sait que la mémoire est sur le point d'être recyclée, il n'est donc pas nécessaire de décrémenter retainCount de 1, car l'objet sera définitivement recyclé qu'il soit décrémenté ou non par 1 ou pas.
    Ne pas modifier cette valeur de 1 à 0 peut réduire une opération de mémoire et accélérer le recyclage des objets.
    Conclusion : n'envoyez pas de messages aux objets qui ont été libérés.

    répondre
    0
  • Annulerrépondre