iPhone si arresta in modo anomalo quando I & # 8220; correttamente & # 8221; rilasciare controller di visualizzazione push

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

Domanda

Ho un'applicazione basata su controller di navigazione e sto riscontrando uno strano problema in cui alcune delle mie spinte del controller di visualizzazione stanno causando arresti anomali in seguito a "popping". il controller di visualizzazione.

L'ho ridotto alla riga di codice che rilascia il controller di visualizzazione dopo averlo inserito nello stack del controller di navigazione.

Il mio codice è simile al seguente:

SomeViewController *viewController = [[SomeViewController alloc] init];
[self.navigationController pushViewController:viewController animated:YES];
[viewController release];  //offending line

Ora questo è un codice di gestione della memoria corretto, ma sfortunatamente sto ricevendo un "double free inviato all'istanza 0x ....." errore (in alcuni casi) e la mia app si arresta in modo anomalo. Questo in genere accade quando visualizzo il controller di visualizzazione.

Sto cercando suggerimenti su cosa guardare. Sono bloccato.

Grazie in anticipo.

Modifica : ecco il risultato del dump della traccia dello stack suggerito da Louis di seguito.

alla prima versione, il conteggio delle trattenute è 13 (credo a causa di un po 'di codice nelle classi base CocoaTouch). Alla fine arriva a questo:

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
     

= oggetto 0xd09070

Se ometto la linea offensiva sopra (la [versione di viewController];) allora il conteggio delle trattenute arriva solo a 2 e l'istanza non viene mai assegnata.

È stato utile?

Soluzione

Viene rilasciato da qualche altra parte. Se vuoi vedere chi lo sta chiamando, puoi semplicemente interrompere le chiamate di rilascio alla classe. Un'altra opzione sarebbe quella di stampare la traccia dello stack nella versione:

#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];
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top