IOS 6.1 mit ARC-Klasse von XIB wird nicht freigegeben, UIClassSwapper

8

Es gibt ein interessantes Problem, bei dem es eine Klasse gibt, auf die in einem XIB-Layout (Unterklasse von UIScrollView) verwiesen wird und die nicht gemäß den Instrumenten / Zuordnungen aufgehoben wird und die ihre Dealloc-Routine nicht unterbricht. Nennen wir es Sclass1.

Es gibt eine using-Klasse (nennen wir sie Uclass), die die XIB-Datei und den outlet enthält.

%Vor%

Dies ist richtig mit dem XIB-Datei-Layout verknüpft.

Sclass1 ist eine Eigenschaft, die zugewiesen wird, wenn das XIB für Uclass geladen wird. Uclass wird von Zeit zu Zeit freigegeben und dann neu erstellt, und daher haben wir eine weitere Instanz von Sclass1, aber Sclass1 geht niemals weg und kann keinen weiteren Verweis darauf finden.

Drill down in Instruments zeigt den einen Malloc und das ist es.

fyi, die Klasse beginnt mit

%Vor%     
ort11 01.07.2013, 15:23
quelle

4 Antworten

5

Wenn ein Objekt unter ARC nicht freigegeben wird, bedeutet dies, dass eine starke Referenz darauf existiert. Da Ihre Eigenschaft weak ist, muss das Objekt stark von etwas anderem als dem Uclass-Objekt verwaltet werden (andernfalls würde es sofort nach dem Laden der XIB freigegeben). In dem Code, den Sie zur Verfügung gestellt haben, ist nicht klar, was der eigentliche starke Besitzer dieses Objekts ist, aber ich nehme an, es könnte eine (oder mehrere) der folgenden sein:

  1. Da die Klasse des Objekts eine UIView -Unterklasse ist, kann sie (stark) von superview referenziert werden, wenn sie als eine von subviews hinzugefügt wird. Dies geschieht automatisch, wenn eine XIB-Datei geladen wird. Wenn das superview nicht freigegeben wird, wird auch das Objekt SClass nicht freigegeben. Sie können diese Eigentumsrechte entfernen, indem Sie removeFromSuperview aufrufen.
  2. Ein starker Besitzzyklus (Retain-Zyklus) existiert irgendwo zwischen den Ivars des SClass1 -Objekts (d. h. eine der stark besessenen Instanzvariablen hat eine starke Referenz zurück auf ihren Besitzer - die SClass1 ). Beachten Sie, dass jeder Block, der self direkt verwendet, auch eine starke Referenz enthält. Eine starke Bezugnahme auf den Block führt dann oft zu einem Rückhaltezyklus. Speichern Sie self in __weak var und übergeben Sie diese stattdessen an den Block, es sei denn, Sie haben einen guten Grund, dies nicht zu tun.
  3. Eine manuell erstellte starke Referenz existiert z.B. Hinzufügen des Objekts zu einem Container oder Speichern des Zeigers auf eine nicht __weak Variable.

Versuchen Sie, diese starken Eigentümer zu finden und zu entfernen. Erst nachdem alle Objekte entfernt wurden, kann das Objekt freigegeben werden.

    
burax 08.10.2013 14:52
quelle
1

Da Ihre Eigenschaft schwach ist und sie immer noch nicht freigegeben ist, suchen Sie nach starken Referenzen auf Sclass oder dessen Eigentümer, Uclass. Vielleicht verwendest du Uclass (oder Sclass) direkt im Block, ohne __weak typeof (self) weakSelf tanzt und dieser Block erzeugt einen Retain-Zyklus. Achten Sie auch auf Eltern-Kind-Beziehungen und Delegierte. Vielleicht gibt es einen Delegierten, der stark statt schwach ist, oder zwei Controller, die starke Referenzen zueinander haben.

Wenn Sie detailliertere Antworten haben möchten, senden Sie bitte relevanteren Code.

    
Timur Kuchkarov 11.10.2013 09:38
quelle
0

Ich denke, Ihr @property sollte für eine Klasse stark sein:

%Vor%

Weil strong gleichbedeutend mit retain ist und ARC die Version für Sie verwaltet.

Sie erhalten weitere Informationen in der Apple-Dokumentation über Übergang zu ARC Versionshinweise im Abschnitt Eigenschaftenattribute .

    
Jordan Montel 07.10.2013 07:55
quelle
0

Ich hatte kürzlich die gleichen Symptome - Um es in meinem Fall zu lösen, handelte mein Objekt als Delegierter für eine Reihe anderer Objekte und musste daher das Objekt von allen Delegiertenpflichten freigeben, bevor es dealloc

aufrufen würde     
300baud 27.01.2014 23:20
quelle

Tags und Links