2016-09-30 3 views
1

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.

Original state

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.

Reference counts (collapsed)

Reference counts


FRAGE:
Warum ist diese UISwitch wie diese verhalten und wie kann ich dieses Problem beheben?

+0

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

+0

@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. –

+0

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

Antwort

0

Dies ist (endlich) in iOS 10.2 behoben