GCD
のブロックにいたとき、私はいつも__weak
の参照をself
に使っていました。誰もがそれをお勧めします。私は、GCDでself
(テスト済み)を強く参照すると、保持サイクルを生成できないことを知っています。 アップルは、ブロックが実行されたときにself
がnil
ならないことを保証するために、自己への__weak
参照し、その_week
リファレンスへ__strong
参照を使用することをお勧めします。iOS - GCD弱く強い自分への参照
- (IBAction)startGCD:(id)sender {
GCDVC* __weak weakSelf = self;
[self.activityIndicator startAnimating];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ // 1
// VC2* __strong strongSelf = weakSelf;
[weakSelf.proArray addObject:@"2"];
[NSThread sleepForTimeInterval:10];
NSLog(@"%@",weakSelf.proArray);
dispatch_async(dispatch_get_main_queue(), ^{ // 2
[weakSelf.activityIndicator stopAnimating];
});
});
}
試験1 Iボタンを押すとインジケータが回転している:
私は次のコードを持っています。 GCDが終了してGCDViewControllerが解放される前に、戻るボタンを押します。
テスト2 次に、自己への強い参照をコメント解除し、同じ手順を実行します。ブロックが終了するまで、GCDViewControllerは解放されません。しかしそれから解放される。
テスト今、私は2
だから私は自分がnilでないことを確認するかどうかをテストして正確な動作を持っている(__weak
または__strong
なし)自己を直接参照する場合は3 ブロックが実行されるときに、への参照__weak
への参照を使用しているのは、__strong
です。ここで何かが恋しい?テスト2の結果を変更する例はありますか& 3?
ブロック内で強い参照を作成して、ブロックの実行中に自己が割り付け解除されるシナリオを防止します。 – dan
はい私はそれを知っています。しかし、__強いから自己への違いは何ですか?私が自己を直接呼び出すと、私は__strongと同様にカウントを保持します。両方のケースで出力が同じです – BlackM
ブロック内で直接selfを参照すると、ブロックが周りにいる限り、selfが割り当て解除されません。ブロックの外側に弱い自己を作成し、その内部に強い自己内部を作成すると、ブロックが周りにいる間に自己を割り振り解除し、ブロックが実行されている間だけ自己を解放できます。 – dan