2011-01-12 4 views
2

Ich habe eine Ansicht in meiner App, die ein UITableView anzeigt. Diese Ansicht wird in einer NIB-Datei erstellt und verfügt über einen benutzerdefinierten Ansichtscontroller. Die UIViewController-Unterklasse für diese Sicht fungiert als Datenquelle und Delegat für UITableView.UIViewController -dealloc wird nach dem Beenden des Modal View-Controllers aufgerufen

Mein UITableView zeigt mehrere Zeilen basierend auf meinen Daten an. Dann zeigt die letzte Zeile einen anderen Text an: "Add another ...". Wenn die letzte Zeile ausgewählt ist, präsentiere ich einen Modal-View-Controller (damit der Benutzer weitere Daten hinzufügen kann). Wenn ich den Modalansicht-Controller verwarne, sehe ich wieder die ursprüngliche Ansicht (wie erwartet) und alles scheint gut zu sein. Wenn ich jedoch versuche, mit dieser Ansicht zu interagieren, stürzt die App ab.

Durch das Platzieren mehrerer NSLog() - Anweisungen über den UIViewController (für UITableView) habe ich festgestellt, dass die Methode -dealloc direkt nach dem Schließen der modalen Ansicht aufgerufen wird. Dies erklärt den Absturz, wenn ich versuche, etwas mit dieser Ansicht zu tun. Ich habe jedoch keine Ahnung, warum -dealloc auf diesem View-Controller aufgerufen wird.

die Modal-View-Controller zu schließen, die ich habe:

[self dismissModalViewController:YES]; 

Da der Code in einem IBAction Verfahren in der UIViewController der Steuerung Ansicht modal. Diese Aktion ist an eine Abbrechen-Schaltfläche in der entsprechenden NIB-Datei gebunden.

Darüber hinaus ist mein Verständnis von der View Controller Programming Guide, dass es in Ordnung ist, den modalen Controller von sich selbst zu entlassen, aber es ist robuster Delegaten zu verwenden. Ich benutzte anfangs einen Delegaten, nahm aber den Delegierten heraus, um das Debuggen zu vereinfachen. Ich setze gerade den Delegierten zurück, um zu überprüfen, und das gleiche Verhalten tritt auf, wenn Delegierte verwendet werden. Die Aktionsmethode modale Controller-Anrufe als implementiert:

[[self delegate] myModalViewController:self didAddObject:obj]; 

Der Delegierte Implementierung in der übergeordneten View-Controller ist:

[self dismissModalViewController:YES] 

Wenn jemand dies vor oder gesehen hat, hat irgendwelche Vorschläge, was geschehen könnte oder Wie das zu debuggen, würde ich sehr schätzen.

+0

Sie meinen, dass der Eltern-View-Controller derjenige ist, der freigegeben wird? – BoltClock

+0

Ja, das stimmt. – jmac

Antwort

6

Wenn -dealloc aufgerufen wird, gibt etwas den View-Controller frei. Versuchen Sie -release in Ihrer View-Controller-Implementierung:

-(void)release { 
    NSLog(@"view controller released"); 
    [super release]; 
} 

, so dass Sie den Debugger verwenden, um den Call-Stack zu untersuchen, wenn diese unerwartete Freigabemeldung geschieht.

+1

Vielen Dank! In der Dealloc-Methode des modalen View-Controllers habe ich [delegate release] angerufen; beabsichtige, gut zu sein und nach mir selbst aufzuräumen. Ich habe nicht darüber nachgedacht, dass das tatsächlich den übergeordneten View-Controller freigeben würde. Ich hätte das ohne Ihren Vorschlag nicht gefunden. Vielen Dank! – jmac

+2

Was können wir anstelle von Release für ARC verwenden? – yatanadam

3

Es ist gefährlich, dismissModalViewController vom Modal-View-Controller selbst aufzurufen (die Nachricht wird an den übergeordneten View-Controller weitergeleitet), wenn Sie sie nicht anderweitig gespeichert haben. Normalerweise ist der übergeordnete Ansichtscontroller dafür zuständig, den von ihm dargestellten modalen Ansichtscontroller zu schließen.

+0

Ich habe meinen ursprünglichen Beitrag aktualisiert, um dies zu beheben. – jmac

+0

Das ist sehr wichtig und schwer herauszufinden! – eliocs

Verwandte Themen