L’iPhone se bloque lorsque j’ai & # 8220; correctement & # 8221; libérer les contrôleurs de vue
-
22-07-2019 - |
Question
J'ai une application basée sur le contrôleur de navigation et je rencontre un problème étrange dans lequel quelques-unes de mes poussées du contrôleur de vue provoquent des plantages lors de l'utilisation de "popping". le contrôleur de vue.
Je l'ai réduit à la ligne de code qui libère le contrôleur de vue après l'avoir placé dans la pile du contrôleur de navigation.
Mon code ressemble à ceci:
SomeViewController *viewController = [[SomeViewController alloc] init];
[self.navigationController pushViewController:viewController animated:YES];
[viewController release]; //offending line
Il s'agit maintenant du code de gestion de la mémoire approprié, mais malheureusement, je reçois un "double libre envoyé à l'instance 0x .....". erreur (dans certains cas) et mon application se bloque. Cela se produit généralement lorsque je saute ledit contrôleur de vue.
Je cherche des suggestions sur ce qu'il faut regarder. Je suis coincé.
Merci d'avance.
Modifier : voici le résultat du vidage de trace de pile suggéré par Louis ci-dessous.
lors de la première version, le nombre de retenues est 13 (je suppose en raison de la présence de code dans les classes de base CocoaTouch). Finalement, cela revient à ceci:
#2009-08-06 22:33:18.304 My App [26601:20b] ** RELEASE CALLED ** 2009-08-06 22:33:18.306 My App [26601:20b] Retain count was : 1 0 My App 0x000033ec start + 4700 1 CoreFoundation 0x302042e8 CFRelease + 136 2 CoreFoundation 0x30227249 CFNumberGetValue + 2937 3 CoreFoundation 0x30204421 _CFRelease + 241 4 Foundation 0x30506515 NSPopAutoreleasePool + 341 5 QuartzCore 0x00b5436e CA_CGRectUnapplyInverseTransform_ + 19738 6 QuartzCore 0x00b54109 CA_CGRectUnapplyInverseTransform_ + 19125 7 CoreFoundation 0x302454a0 CFRunLoopRunSpecific + 3696 8 CoreFoundation 0x30244628 CFRunLoopRunInMode + 88 9 GraphicsServices 0x32044c31 GSEventRunModal + 217 10 GraphicsServices 0x32044cf6 GSEventRun + 115 11 UIKit 0x309021ee UIApplicationMain + 1157 12 My App 0x00002258 start + 200 13 My App 0x000021c6 start + 54 14 ??? 0x00000001 0x0 + 1 2009-08-06 22:33:18.307 My App [26601:20b] ########### DEALLOC
objc[26601]: FREED(id): message retainCount sent to freed
object = 0xd09070
Si j'omets la ligne incriminée ci-dessus (la [version de viewController];), le nombre de conservations le rend uniquement à 2 et l'instance n'est jamais désallouée.
La solution
Il est publié ailleurs. Si vous voulez voir qui l’appelle, vous pouvez interrompre les appels de libération à la classe. Une autre option serait d’imprimer la trace de la pile dans la version:
#include <execinfo.h>
#include <stdio.h>
- (void) release {
void* callstack[128];
int i, frames = backtrace(callstack, 128);
char** strs = backtrace_symbols(callstack, frames);
for (i = 0; i < frames; ++i) {
printf("%s\n", strs[i]);
}
free(strs);
[super release];
}