2016-04-19 5 views
1

Objective-CでNSBlockOperationを使用しているときにメモリリークを回避するには、ブロック内のブロック操作を参照できるように変数をweakとして宣言する必要があります。必要であれば)、キャンセル、一般的にこのような:私は弱いとして私NSBlockOpeartionを宣言しようとすると、Swift NSBlockOperation()Leak:NSBlockOperation()を弱くできません

__weak NSBlockOperation *blockOp = [NSBlockOperation blockOperationWithBlock:^{ 
    if (blockOp.cancelled) { 
     ... 
    } 
}]; 

しかしスウィフトでは、それは常にnilです。

weak var blockOp = NSBlockOperation() 

弱い参照がなければ、毎回メモリが少し漏れていることを除いて、すべてが問題ありません。 Swiftでメモリをリークすることなく、ブロック内のブロックをどのように参照できますか?

+0

ゼロ強い参照がある場合、あなたが一般のObj-Cで正確に同じ問題を抱えているだろう – nhgrif

+0

....弱参照を自動的にゼロになります。 – jtbandes

答えて

2

明示的なキャプチャリストを使用して、操作に対する所有者のない参照を取得できます。 (これは、操作は限りそのブロックが実行されているとして保持されますので、私は実際にあなたがまだその保証と不快なら、あなたの代わりにweakを使用することができます。、所有されていない参照を使用してお勧めしたいだけ倍の一つである。)

この変数は、それ自身の初期値から参照することができないので、2行に分割されなければならないこと
let op = NSBlockOperation() 
op.addExecutionBlock { [unowned op] in 
    print("hi") 
    if op.cancelled { ... } 
}

注意。

+0

これは、最初のテストで動作するようです。私は弱いのが好きだと思いますが、私の投稿で言及したように、NSBlockOperation()で割り当てようとすると弱いと宣言したときにはそれを宣言しません.2行に分割しなければならないので、それをどのように割り当てるべきかを知っていない。 –

+0

私は '[unowned op]'を使ったのと同じ方法で '[weak op]'を使うことができます。 – jtbandes

関連する問題