Podczas sesji WWDC 2014 403 Intermediate Swift i transkrypcji pojawił się następujący slajd
Mówca powiedział w takim przypadku, że jeśli go nie użyjemy [unowned self]
, nastąpi wyciek pamięci. Czy to oznacza, że zawsze powinniśmy używać [unowned self]
zamknięcia wewnętrznego?
W linii 64 ViewController.swift aplikacji Swift Weather nie używam [unowned self]
. Ale aktualizuję interfejs za pomocą niektórych @IBOutlet
takich jak self.temperature
i self.loadingIndicator
. Może być OK, ponieważ wszystkie @IBOutlet
s, które zdefiniowałem, są weak
. Ale czy ze względów bezpieczeństwa powinniśmy zawsze używać [unowned self]
?
class TempNotifier {
var onChange: (Int) -> Void = {_ in }
var currentTemp = 72
init() {
onChange = { [unowned self] temp in
self.currentTemp = temp
}
}
}
onChange
powinien być [weak self]
zamknięciem, ponieważ jest to właściwość publiczna (wewnętrznie, ale nadal), aby inny obiekt mógł uzyskać i przechowywać zamknięcie, utrzymując obiekt TempNotifier w pobliżu (bezterminowo, jeśli obiekt używający nie puścił onChange
zamknięcia, dopóki nie zobaczy, że TempNotifier
zniknął, poprzez swoje własne słabe odniesienie do TempNotifier
) . Gdyby var onChange …
były, private var onChange …
to [unowned self]
byłoby poprawne. Nie jestem jednak tego w 100% pewien; proszę mnie poprawić, jeśli się mylę.
[]
? Nie mogę znaleźć wyjaśnienia w dokumentach Apple.
{}
to puste zamknięcie (instancja zamknięcia) jako domyślne (nic nie robi), (Int) -> Void
to definicja zamknięcia.