2016-05-18 10 views
0

Objective-Cでは、特定の状況で保持サイクルを避けるために、__weakとして値をキャストします。 __strongがSwiftのObjective-C __strong相当

__weak typeof (self) weakSelf = self; 

self.block = ^{ 
    [weakSelf methodA];   
}; 

は、我々は、具体的スウィフトで__strong自己同等が必要です有用であり、それが利用可能である理由

This postは説明しますか?もしそうなら、構文はどうですか?

+1

[引数付きスウィフトブロックで弱いセルフを正しく処理する方法](http://stackoverflow.com/questions/24468336/how-to-correctly-handle-weak-self-in-swift-blocks- with-arguments) – ozgur

+0

Obj-CとSwiftの変数とivarsのデフォルトは '__strong'です。 Obj-Cがそのキーワードを持つ唯一の理由は一貫性だと私は思う。明示的に書く必要はありません。 – hamstergene

答えて

1

デフォルトですべての変数が強いため、Swiftには__strongのようなものはありません。以下は

上記のコードのスウィフトと同等です:

self.block = { [weak self] in 
    self?.methodA() 
} 

あなたはブロックの実行中に生きselfを維持したい場合は、以下のような何かすることができますで

self.block = { [weak self] in 
    guard let strongSelf = self else { return } 
    strongSelf.methodA() 
} 

を上記のコードstrongSelfはブロック内にweakSelfへの強い参照を作成するので、弱い参照は解放されない一方、強いものは生きている(この場合、ブロックfinis実行中)

上記のオプションのいずれものサイクルは、を保持しません。

+0

weak自己参照を保持するstrongSelf参照が一時的な保持サイクルを引き起こすと言うのは公正でしょうか?ブロックの実行が終了すると、保持サイクルが中断されます。あなたが思うこと ? –

+0

はい、ブロックが強い参照を保持しているので、自己が生き続ける一時的なサイクルが存在すると言うのは安全です。しかし、要点は、デッドロックが発生して自己を割り振り解除しないようにするべきであるということです。 weakキーワードを使用すると、weakポインタへの強い参照を作成することによって、決してそれが起こらないようにします。 – ozgur

+0

私に戻ってくれてありがとう。 –

関連する問題