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