2015-11-11 10 views
9

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

+0

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

+1

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

+0

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

risposta

3

Credo che il problema qui è che self è speciale. Hai passato il riferimento a self debolmente nella funzione anonima per impedire un ciclo di conservazione, ma in questo articolo non è disponibile il wrapping facoltativo self. Quindi, lo zucchero sintattico self?.someView.alpha = 1 - e ricorda che lo è lo zucchero sintattico - non funziona.

È possibile che Apple lo consideri un bug; o forse no. Ma in entrambi i casi, la soluzione è quella di fare in modo esattamente quello che stai facendo nel secondo esempio: fai il ballo debole-forte esplicitamente.

Problemi correlati