Die Verwendung von dismissModalViewControllerAnimated wird keinen Speicher freigeben

8

Ich habe einen sehr einfachen Code, um einen modalen Controller anzuzeigen (nextController ist ein Klassenmitglied):

%Vor%

Und dann, wenn der Controller ausblenden sollte:

%Vor%

Alles funktioniert gut wie erwartet, aber wenn ich Geräte-Objektzuordnungen durchführe, zeigt es, dass der Speicher, den er zugewiesen hat, nach dem Verwerfen des modalen Controllers nicht freigegeben wird. Das wird zum Problem, denn wenn ich mehrere Controller zeige, ist der Speicher beendet ...

Kann mir jemand Hinweise geben? Clang sieht keine Probleme, also stopfe ich das Speicherlimit, weil die Erinnerung an die entlassenen Controller nicht freigegeben wird.

EDIT: Was ich bis jetzt entdeckt habe ist, dass es irgendwo in Apples Sachen ein Leck zu sein scheint. Möglichkeit zu reproduzieren: XCode - & gt; Erstellen Sie ein neues Projekt mit der Vorlage "Utility-Anwendung". Schreibe keinen Code selbst. Erstellen Sie einfach eine neue Utility-Anwendung und führen Sie sie mit "Object allocations" aus, wählen Sie "Created & amp; Still living". Jetzt klappen Sie den modalen Controller einige Male um - Sie werden sehen, dass der zugewiesene Speicher jedes Mal wächst und wächst, wenn der modale Controller erscheint und wenn er auch verschwindet ...

    
Marin Todorov 03.12.2009, 21:15
quelle

2 Antworten

1

Es gibt kein Leck im Code, den Sie zeigen, soweit ich sehen kann. könnte ein Leck in InstructionsScreen sein, das eine Freigabe verhindern würde.

Ich denke, es lohnt sich, den Static Analyzer auszuführen, um zu sehen, ob er ein Leck findet.

Das Leck im Apple Template Code ist interessant. Es könnte sein, dass es ein Leck gibt. Es scheint unwahrscheinlich, aber offensichtlich ist es nicht unmöglich. Ich würde sagen, dass es wahrscheinlicher ist, dass es in Instrumenten falsch-positiv ist, weshalb ich vorschlagen würde, den statischen Analysator zu verwenden.

(Vielleicht möchten Sie einen Fehlerbericht über das Leck erstellen.)

    
Stephen Darlington 10.11.2011 09:09
quelle
0

Modale Ansichten sind keine Teilansichten der aufrufenden Ansicht, sondern sind Teilansichten des Apps-Fensters und werden vom Fenster selbst beibehalten. Sie behalten im Allgemeinen keine Referenz auf sie in der Steuerung, die sie aufruft. Rufen Sie stattdessen die modale Ansicht hervor und lassen Sie sie dann mit dem Controller kommunizieren, indem Sie den Controller als Delegierten der modalen Ansicht definieren.

Ich denke, wenn Sie synthesize verwenden, um den Accessor für eine nextController -Eigenschaft zu erstellen, die mit retain definiert ist, behält der Accessor jedes Objekt, das der Eigenschaft zugewiesen ist. Wenn Sie den Wert auf nil setzen, wird das Objekt nicht freigegeben, es sei denn, der Accessor ist dafür eingerichtet, und ich glaube nicht, dass die automatisch generierten das tun.

Sie müssen ausdrücklich release aufrufen, bevor Sie auf null setzen.

Wenn dies nicht funktioniert, geben Sie den Code für Ihre Definition der Eigenschaft nextController ein.

    
TechZen 03.12.2009 21:43
quelle