2014-10-01 4 views
9

Perché l'inizializzazione su weak var restituisce la variabile come nil mentre l'inizializzazione al solito var restituisce il risultato previsto? Nel seguente codice ViewController.swift:Perché l'inizializzazione su `weak` restituisce` nil` in Swift?

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)") 
} 

Questa registrato il seguente alla console:

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

Ma perché il primo ritorno nil? Penso che se si definisce una variabile come weak, allora quando il controller di visualizzazione che ha definito la "variabile di trama" (self in questo caso) è scomparso, la "variabile rotta" è scomparsa in conformità con essa. Tuttavia, credo di non rimuovere l'istanza del ViewController nel codice non assegnare nil ad esso, in particolare all'interno del suo metodo viewDidLoad().

Quindi, se riesco a visualizzarlo correttamente, perché la "variabile rotta" restituisce nil all'avvio? Quando lo uso con @IBOutlet, non diventa nil (ma non ho bisogno di renderlo esplicitamente inistantato, però). E dovrei definire la variabile di istanza senza weak quando voglio inizializzarla dal codice, specialmente all'interno di viewDidLoad()?

Voglio mantenere la variabile all'esterno di viewDidLoad() perché voglio fare riferimento all'istanza da altri metodi. Qual è il modo migliore in questo caso?

+1

https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/ProgrammingWithObjectiveC.pdf pagina 62: l'oggetto appena assegnato non ha riferimenti forti ad esso, quindi è immediatamente deallocato e someObject è impostato su zero. –

+0

In Swift ci sono due tipi di riferimenti deboli: debole che è lo stesso di Objective-C e unowned. La differenza è che un riferimento non condiviso non può mai essere nulla. – gabbler

risposta

14

weak significa che la variabile non mantiene l'oggetto e sarà deallocato se non ci sono altri riferimenti forti ad esso. @IBOutlet Le variabili weak non sono nulle, perché quelle viste hanno forti riferimenti dalla gerarchia delle viste dei controller della vista.

È necessario fare riferimento con un riferimento forte al pulsante e aggiungerlo per visualizzare la gerarchia prima che sia possibile assegnarlo a una proprietà debole o semplicemente non utilizzare la proprietà weak.

+0

curiosamente. quindi nel qual caso dovrei usare debole? sembra che dovrei sempre usare forte se il riferimento al ciclo non succederà – ikzjfr0