Se io dichiaro [weak self]
su una chiusura e di riferimento self
come self?
all'interno UIView.animateWithDuration
l'applicazione andrà in crash:Fare riferimento a [sé debole] come auto? all'interno animateWithDuration provoca incidente
someFunc() { [weak self] (success) -> Void in
UIView.animateWithDuration(0.25) {
self?.someView.alpha = 1;
}
}
con un message sent to deallocated instance
ma se Opzionalmente auto Separa prima del tempo doesn 't
someFunc() { [weak self] (success) -> Void in
if let weakself = self {
UIView.animateWithDuration(0.25) {
weakself.someView.alpha = 1;
}
}
}
Perché è così, penserei che non importa in quale modo faccio riferimento al se debole Dal momento che dovrebbe "solo" opzionalmente scartare correttamente self?
. Per contesto questo viene fatto in una UICellView
che viene deallocato quando lascio l'EDIT UICollectionViewController
: Archiviato un bug con la mela: # 23492648
Questo in realtà è davvero strano, odora come un insetto per me. A proposito di cosa non è necessario ';? Stai chiamando una funzione o è una proprietà? – Kametrixom
Grazie per averlo sottolineato, l'ho modificato per chiarezza invece di "doSomething". Ho spinto per usare ';' nel nostro codebase perché rende la fine delle dichiarazioni univoca. Ci sono situazioni in cui potresti avere una dichiarazione che racchiude una riga e non è super ovvio :) – Shizam
Questa è una buona segnalazione di bug, e dovresti segnalarla ad Apple. Ma è anche vero che dovresti sempre fare una danza debole-forte quando trasferisci le cose debolmente in una funzione anonima, come fai nel secondo esempio ('if let weakself = self'), quindi fallo e prosegui. – matt