L’iPhone se bloque lorsque j’ai & # 8220; correctement & # 8221; libérer les contrôleurs de vue

StackOverflow https://stackoverflow.com/questions/1230918

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.

Était-ce utile?

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];
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top