2015-07-16 11 views
5

In Objective-C in blocchi non banali ho notato l'uso di weakSelf/strongSelf.Qual è il modo corretto di usare strongSelf in swift?

Qual è il modo corretto di utilizzare strongSelf in Swift? Qualcosa di simile:

if let strongSelf = self { 
    strongSelf.doSomething() 
} 

Così, per ogni riga contenente sé in chiusura devo aggiungere strongSelf controllare?

if let strongSelf = self { 
    strongSelf.doSomething1() 
} 

if let strongSelf = self { 
    strongSelf.doSomething2() 
} 

Esiste un modo per rendere più elegante il suddetto?

+0

Non c'è niente di speciale 'strongSelf' qui. È solo un nome variabile. Forse aggiungi il codice Objective-C che desideri replicare? Quello che stai facendo qui non è diverso da semplicemente 'self?.. Qualcosa()' – nhgrif

+0

Si prega di verificare questa domanda c'è '[unowned self]' in swift: http://stackoverflow.com/questions/24320347/shall-we -always-use-unowned-self-inside-closure-in-swift e https://dhoerl.wordpress.com/2013/04/23/i-finally-figured-out-weakself-and-strongself/ –

risposta

15

Utilizzare strongSelf è un modo per verificare che self non è uguale a nil. Quando si ha una chiusura che può essere chiamata in futuro, è importante passare un'istanza di self weak in modo da non creare un ciclo di conservazione tenendo i riferimenti agli oggetti che sono stati deinitializzati.

{[weak self]() -> void in 
     if let strongSelf = self { 
     strongSelf.doSomething1() 
     } 
} 

In sostanza si sta dicendo che se il sé non esiste più non tenere un riferimento e non eseguire l'azione su di esso.

+0

A clear spiegazione. –

1

Se si utilizza self nella chiusura, viene utilizzato automaticamente come forte.

C'è anche modo di utilizzare come weak o unowned se si tenta di evitare un ciclo di conservazione. Si ottiene passando [auto non posseduto] o [auto debole] prima dei parametri di chiusura.

2

L'utilizzo di strongSelf sembra essere diretto solo chiamando il metodo doSomethingN() se self non è nullo. Invece, utilizzare il metodo opzionale invocazione come l'approccio preferito:

self?.doSomethingN() 
2

un altro modo di utilizzare weak self senza utilizzare strongSelf

{[weak self]() -> void in 
     guard let `self` = self else { return } 
     self.doSomething() 
} 
+5

Amo questo, ma stai attento. Chris Lattner ha dichiarato esplicitamente che questo è un bug del compilatore https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20160118/007425.html – wuf810