Frage

Ich habe eine Navigation-Controller-basierte Anwendung, und ich bin in eine seltsame Frage laufen, wo ein paar meiner Ansicht-Controller drücken Abstürze verursachen auf „Popping“ View-Controller.

Ich habe es verengt die Codezeile nach unten, der die View-Controller freigibt, nachdem es auf dem Navigationscontroller Stack schieben.

Mein Code sieht wie folgt aus:

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

Nun ist diese ist richtiger Speicher-Management-Code, aber leider erhalte ich ein „doppelten frei Instanz 0x gesendet .....“ Fehler (in einigen Fällen) und meine App stürzt ab. Dies geschieht in der Regel, wenn ich sagte View-Controller-Pop.

Ich suche nach Anregungen, was zu sehen. Ich bin fest.

Vielen Dank im Voraus.

Bearbeiten . Hier ist das Ergebnis des Stack-Trace-Dump von Louis vorgeschlagen unter

auf der ersten Veröffentlichung, die Beibehaltungszähler sind 13 (ich bis zu einem gewissen Code aufgrund erraten tief in den Basisklassen Cocoatouch). Schließlich wird es so weit nach unten:

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

Wenn ich die Codezeile oben weglassen (das [Viewcontroller Release];). Dann behält die zählen macht es nur zu 2 und die Instanz nie dealloc'ed

War es hilfreich?

Lösung

Es wird woanders veröffentlicht. Wenn Sie sehen wollen, wer sie ruft dich nur auf Freigabe brechen können Anrufe an die Klasse. Eine andere Möglichkeit wäre aus dem Stack-Trace in Freigabe drucken:

#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];
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top