La réponse aux graines de melon extraordinaires est correcte.
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.
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.
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é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.
La réponse aux graines de melon extraordinaires est correcte.
L'appel de
NSMutableArray
sur l'objetcopy
renvoie un objet NSArray, donc lorsque[array4 release]
est appelé, la méthode dealloc de array4 est appelée etNSArray 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.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 dea
.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é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émenterretainCount
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.