Ist ARC Memory Management von presentViewController: animiert: Vervollständigung: in iOS 6.x unterbrochen?

8

Mein View-Controller präsentiert eine Ansicht über die Methode presentViewController:animated:completion: . Die Aussicht ist gut präsentiert.

Dann verwerfe ich diese Ansicht und präsentiere sie erneut und bekomme folgenden Absturz:

%Vor%

Mein Code verwendet ARC. Hier ist der Code meiner WebBrowser-Klasse, ein einfacher eingebetteter Browser.

WebBrowser.h:

%Vor%

WebBrowser.m:

%Vor%

Und schließlich hier ist, wie ich die Ansicht in meinem übergeordneten View-Controller präsentieren:

%Vor%

Ich verwende iOS 6 und kompiliere mit ARC.

Zuerst dachte ich, dass dieser Fehler ARC-bezogen ist. Hier ist mein ursprünglicher Beitrag:

ORIGINAL POST

Ich habe Abstürze in meiner App mit iOS 6.x festgestellt, als Modal View-Controller angezeigt wurden, und sie wurden freigegeben, wenn sie mit früheren Versionen von iOS einwandfrei funktionierten.

Beschuldige mich, ARC noch nicht benutzt zu haben (es ist mein nächster großer Schritt in diesem Projekt), aber zum Beispiel, wenn man Game Center-Bestenlisten mit dem folgenden Code anzeigt, die folgenden Schritte:

  1. zeigt die Bestenliste an
  2. Schließen Sie die Bestenliste
  3. zeigt das Leaderboard erneut an (PRÄZISIONS-UPDATE: indem Sie dieselbe showLeaderboard wie unten gezeigt ausführen, dh eine neue Instanz von GKLeaderboardViewController anzeigen)

dann passiert der folgende Fehler

%Vor%

Das ist mein Code:

%Vor%

Es stellt sich heraus, dass das Entfernen des Befehls [lb release] mein Problem löst und dass es keinen solchen Absturz mit iOS 5.x gibt.

Das gleiche passiert mit dem Game Center-Erfüllungs-View-Controller oder jedem anderen benutzerdefinierten View-Controller von mir, der mit presentModalViewController: angezeigt wird.

Es scheint auch, dass das Ersetzen des veralteten presentModalViewController: Befehls durch den neuen presentViewController:animated:completion: NICHT das Problem löst.

    
Dirty Henry 07.12.2012, 13:44
quelle

2 Antworten

1

Ich sehe mindestens ein mögliches Problem:

%Vor%

Im Allgemeinen ist es sicherer, delegate auf nil zu setzen, bevor stopLoading aufgerufen wird.

Außerdem ist es definitiv sicherer, dismissViewControllerAnimated so zu verwenden, wie es verwendet werden soll, dh es auf dem presenting -Controller aufzurufen. Obwohl die Dokumentation besagt, dass der Aufruf an den präsentierenden Controller übergeben wird, ist es keine gute Idee, eine Methode für ein Objekt aufzurufen, das innerhalb der Methode freigegeben wird.

%Vor%     
Sulthan 07.03.2013 16:53
quelle
1

Bearbeiten

Laut Apples Dokumentation sollten Sie den Viewcontroller vom übergeordneten (präsentierenden) viewcontroller ablehnen: Ссылка

"Wenn es an der Zeit ist, einen präsentierten View-Controller zu schließen, ist der bevorzugte Ansatz, den präsentierenden View-Controller zu entlassen. Mit anderen Worten, wann immer möglich, sollte derselbe View-Controller, der den View-Controller präsentierte, auch die Verantwortung übernehmen es. "

Können Sie auch bitte aufklären, welche Viewcontroller welche darstellen und wie viele übereinander liegen. von Äpfeln docs:

"Wenn Sie mehrere View-Controller nacheinander bereitstellen und somit einen Stapel von präsentierten View-Controllern erstellen, wird durch Aufruf dieser Methode auf einem View-Controller im Stack der direkte Child-View-Controller und alle View-Controller über diesem Child auf dem Stack gelöscht Wenn dies der Fall ist, wird nur die oberste Ansicht in einer animierten Art und Weise verworfen, alle Zwischenansicht-Controller werden einfach aus dem Stapel entfernt. Die oberste Ansicht wird mit ihrem Modal-Übergangsstil, der sich von den Stilen unterscheiden kann, entfernt andere View-Controller im Stapel. "

Wenn Sie also denken, dass es etwas mit delegierten Methoden aus Ihrer Webansicht zu tun hat, sollten Sie die Ansicht von der delegate -Eigenschaft möglicherweise abbestellen / das Laden der webview in viewWillUnload stoppen, nicht in der ablehnenden IBAction, da diese gewonnen hat Muss nicht unbedingt heißen.

Ich habe dies bearbeitet, um es vollständiger / klarer zu machen

Sie müssen die Browseransicht auf eine Instanzvariable mit einer starken Eigenschaft festlegen, bevor Sie die Ansicht präsentieren. Dann setze es auf Null, nachdem du es abgewiesen hast.

Erstellen Sie zuerst ein Delegate-Protokoll für Modals:

%Vor%

Abonnieren Sie in Ihrer Benutzeroberfläche für die Darstellung von Ansichtscontrollern das Protokoll:

%Vor%

In Ihrer Implementierung, wenn Sie die Ansicht präsentieren:

%Vor%

In Ihrem Webbrowser-Interface:

%Vor%

In Ihrer WebBrowser-Implementierung:

%Vor%

Und zurück in Ihrem übergeordneten View-Controller:

%Vor%     
G. Shearer 07.03.2013 16:58
quelle

Tags und Links