三个关于objective-c内存管理的疑惑,希望能有人帮我解答
PHPz
PHPz 2017-04-24 09:12:06
0
2
417

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

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

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

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

PHPz
PHPz

学习是最好的投资!

répondre à tous(2)
阿神
  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.

Ty80

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.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal