2012-12-06 2 views
6

Ich bin relativ neu in der iOS-Entwicklung und schätze Ihre Hilfe bei der Suche nach der Ursache für den Fehler, dem ich begegnet bin.Eine Objective-C-Nachricht wurde an ein freigegebenes Objekt (Zombie) unter der folgenden Adresse gesendet: 0x75d52a0

Ich habe versucht, den Fehler mit Instrumenten (d. H. Allocations-Zombie Profiler) zu debuggen, aber ich konnte keinen Sinn für die Call-Stacks, die vorgestellt wurden.

Dies ist, wie die Benutzerschnittstellen verbunden sind: TabBarController -> Navigation -> TopPlacesTableViewController -> RecentPhotosTableViewController -> PhotoViewController

Der Fehler tritt auf, wenn ich auf die Schaltfläche Zurück in der letzten Ansicht klicken (das heißt, dass der PhotoViewController). Diese Aktion soll den vorherigen RecentPhotosTableViewController zeigen, aber stattdessen wurde auf ein unbekanntes freigegebenes Objekt zugegriffen, irgendwann zwischen den Ereignissen von viewWillAppear und ViewDidAppear.

Zusätzlich habe ich eine GenericTableViewController, die Eltern von TopPlacesTableViewController und RecentPhotosTableViewController ist. Die untergeordneten Elemente legen eine NSMutableArray-Eigenschaft im übergeordneten Element fest. Dies sind die Daten, die in die untergeordneten Ansichten geladen werden.

Ich verwende derzeit iOS6 und XCode4.5.

[Update: In der Konsole wurde diese Zeile angezeigt - "[UIView _forgetDependentConstraint:]: Nachricht an freigegebene Instanz xxx gesendet"].

+0

Kompilieren Sie mit ARC, oder nein? –

+0

Ja, ich bin. Ich habe gerade Anoop Vaidya geantwortet, wie ich bestätigt habe, dass ARC eingeschaltet ist. – user1881383

Antwort

0

Ich fühle, dass Sie ARC nicht verwenden, und Sie nicht behalten, Ihr vorheriges Objekt zu übergeben. In der Zwischenzeit wird das vorherige Objekt freigegeben und Sie greifen darauf zu.

Entweder können Sie Ihren Code umwandeln, um ARC zu verwenden oder beibehalten oder automatisch freigeben.

+0

Danke für die schnelle Antwort! Ich habe gerade die Einstellung unter "Ihr Ziel -> Build-Einstellungen -> Apple LLVM Compiler - Sprache -> Automatische Objective-Referenzzählung" überprüft und bestätigt ARC ist eingeschaltet. Kann ich genau feststellen, welches Objekt freigegeben wurde und auf welches nach der Freigabe zugegriffen wurde? – user1881383

+0

Das ist sehr schwer zu finden, man muss einen Breakpoint machen und über jede Zeile gehen ... eine große Aufgabe. Oder eine Sache, die Sie tun können, ist, da Sie sicher sind, dass Sie ARC verwenden, so dass Sie selbst nicht [...] freilassen können. Also kannst du jedes Objekt stark machen und dann nachsehen. –

+0

Das Seltsamste ist passiert. Nachdem der PhotoViewController gelöscht und ein neuer auf das Storyboard gezogen wurde, ist der Fehler nicht erneut aufgetreten. – user1881383

-1

Zum Produkt> bearbeitet Schema> Diagnose dann tippen überprüfen aktivieren Zombie-Objekte

einen Haltepunkt machen und ging Schritt für Schritt zu wissen, welches Objekt freigegeben wird, ist es vielleicht der Zeiger auf das Objekt wurde dann entfernt Das Betriebssystem hat Ihr Objekt freigegeben.

+2

Ich habe Zombie-Objekte aktiviert, aber der Call-Stack ist nicht sinnvoll. Die einzige verständliche Zeile des Codes von Objective C wird von der Hauptmethode von AppDelegate ausgelöst (d. H. @autoreleasepool {return UIApplicationMain (argc, argv, null, NSStringFromClass ([PhotosAppDelegate class]);}). – user1881383

Verwandte Themen