Dies ist ein Repost meiner Frage vor, aber wegen zu vielen Bearbeitung und ich habe meine Beispiele vereinfacht, ich dachte, es wäre klarer, wenn ich eine neue Frage erstellen, anstatt die Fragen mehrmals zu bearbeiten .UISwitch nicht freigeben
PROBLEM:
UISwitch
Objekt irgendwie auch dann nicht, wenn ausplanen nichts mit ihm geschehen ist.
PROJEKT:
Es gibt nur zwei View-Controller. VC1 und VC2. VC1 hat einen Knopf, um VC2 zu präsentieren. VC2 enthält eine Schaltfläche zum Ablehnen und eine Eigenschaft einer benutzerdefinierten UISwitch
, UILabel
und eine UIStepper
.
VC1:
class VC1: UIViewController {
let button = UIButton()
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(button)
button.addTarget(self, action: #selector(open), for: .touchUpInside)
// Some auto layout (not relevant to the question)
}
func open() { present(VC2(), animated: true) }
}
VC2:
class VC2: UIViewController {
let button = UIButton()
let shifty = CustomSwitch() // Note: nothing has been done with this
let labels = CustomLabels()
let steppy = CustomSteppy()
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(button)
button.addTarget(self, action: #selector(close), for: .touchUpInside)
// Some auto layout (not relevant to the question)
}
func close() { dismiss(animated: true) }
}
UNTERKLASSEN:
class CustomSwitch: UISwitch { deinit { print("Switch has been deinitialized") } }
class CustomLabels: UILabel { deinit { print("Labels has been deinitialized") } }
class CustomSteppy: UIStepper { deinit { print("Steppy has been deinitialized") } }
Der einzige Grund, warum ich diese Unterklassen erstellt ist s o ich könnte sie im Profiler einfacher verfolgen. Das Gleiche passiert auch, wenn ich keine Unterklasse UISwitch
.
EDIT:
Ich habe eine hinzugefügt deinit
zu den Unterklassen und sowohl die UILabel
sowie die UIStepper
zeigen die Meldung:
Labels has been deinitialized
Steppy has been deinitialized
So ist es nicht die UISwitch
scheinen wird immer deinitialisiert.
SCREENSHOT:
In diesem Screenshot habe ich geöffnet und geschlossen VC2 mehrere Male. Dort können Sie sehen, nur das Objekt CustomSwitch
blieb hartnäckig, während CustomLabels
und CustomSteppy
wurde freigegeben, so wie es sein sollte.
Wie Rmaddy vorgeschlagen und auch der Grund, warum ich das Ergebnis der Referenz zählt eine neue Frage erstellen wollte. Ich habe ein paar Erklärungen zu SO verfolgt, aber ich bin mir nicht sicher, was ich daraus machen soll.
FRAGE:
Warum ist diese UISwitch wie diese verhalten und wie kann ich dieses Problem beheben?
Haben Sie getan, was ich auf Ihre vorherige Frage vorgeschlagen? Zur Erinnerung, das war die Checkbox "Record Reference Counts" in Instruments zu markieren und die App erneut zu profilieren. Dann sehen Sie, was eine Referenz zu jedem Schalter behielt. – rmaddy
@rmaddy Tut mir leid, ja, ich habe es getan und ich habe vergessen, diese Screenshots hinzuzufügen. Ich bin mir nicht sicher, was ich daraus machen soll, da ich gerade sehr verwirrt bin. Versuchen und suchen, es zu beheben, aber immer noch kein Glück. –
Es zeigt die Zählung als +0. Das bedeutet, dass es hätte freigegeben werden sollen. Testen Sie auf einem echten Gerät oder dem Simulator? Ich traue dem Simulator für diese Art von Dingen nicht. – rmaddy