2014-10-01 14 views
9

Warum gibt die Initialisierung an weak var die Variable als nil zurück, während die Initialisierung auf die üblichen var das erwartete Ergebnis zurückgibt? Im folgenden Code auf ViewController.swift:Warum gibt die Initialisierung zu "weak" in Swift "nil" zurück?

weak var myButton: UIButton! 
var myButtonNotWeak: UIButton! 

override func viewDidLoad() { 
    let frame = CGRect(x: 0, y: 0, width: 100, height: 100) 
    myButton = UIButton(frame: frame) 
    myButtonNotWeak = UIButton(frame: frame) 
    print("\(myButton), \(myButtonNotWeak)") 
} 

Dies meldet nach dem an die Konsole:

nil, <UIButton: 0x7f946bc424a0; frame = (0 0; 100 100); opaque = NO; layer = <CALayer: 0x7f946bc42920>> 

Aber warum hat die erste Rückkehr nil? Ich denke, wenn Sie eine Variable wie weak definieren, wenn der View-Controller, der die "schwache Variable" (self in diesem Fall) definiert hat, weg ist, ist die "schwache Variable" in Übereinstimmung damit gegangen. Ich glaube jedoch, dass ich die Instanz des ViewControllers nicht im Code nil, insbesondere innerhalb seiner viewDidLoad() Methode, entferne.

Also, wenn ich es richtig bekomme, warum gibt die "geschwächte Variable" nil zurück, wenn initiiert? Wenn ich es mit @IBOutlet benutze, dann wird es nicht nil (aber ich muss es nicht explizit in distantiate). Und sollte ich die Instanzvariable ohne weak definieren, wenn ich sie aus dem Code entfernen möchte, besonders innerhalb von viewDidLoad()?

Ich möchte die Variable außerhalb von viewDidLoad() beibehalten, weil ich auf die Instanz von anderen Methoden verweisen möchte. Was ist der beste Weg in diesem Fall?

+1

https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/ProgrammingWithObjectiveC.pdf Seite 62: Das neu zugewiesene Objekt hat keine starken Verweise darauf, daher wird es sofort freigegeben und someObject ist auf Null setzen. –

+0

In Swift gibt es zwei Arten von schwachen Referenzen: schwach ist das gleiche wie in Objective-C und unowned. Der Unterschied besteht darin, dass eine unbenannte Referenz niemals null sein kann. – gabbler

Antwort

14

weak bedeutet, dass die Variable das Objekt nicht zurückbehält und die Zuordnung aufgehoben wird, wenn keine anderen starken Referenzen darauf vorhanden sind. @IBOutletweak Variablen sind nicht NULL, da diese Sichten starke Referenzen von View-Controllern haben.

Sie müssen sich mit starkem Verweis auf Ihre Schaltfläche beziehen und sie zur Ansichtshierarchie hinzufügen, bevor Sie sie einer schwachen Eigenschaft zuweisen können, oder verwenden Sie einfach keine weak-Eigenschaft.

+0

neugierig. Also, in welchem ​​Fall sollte ich schwach verwenden müssen? es scheint, dass ich immer stark verwenden sollte, wenn Zyklusreferenz nicht passieren würde – ikzjfr0

Verwandte Themen