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% 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:
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.
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. __weak
Variable. Versuchen Sie, diese starken Eigentümer zu finden und zu entfernen. Erst nachdem alle Objekte entfernt wurden, kann das Objekt freigegeben werden.
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.
Ich denke, Ihr @property
sollte für eine Klasse stark sein:
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 .
Tags und Links ios automatic-ref-counting xib