2

私は、ブロックとリテイン サイクルを作成する可能性について少し妄想的になりました。UIAlertViewデリゲート メソッドの代わりにブロックを使用できるようにするクラスのブロック ベース バージョンを使用しています。私はこれらの Alertviews を多く使用しているため、多くの面倒な作業を行うインスタンス メソッドを呼び出すことがよくあります。

メソッドで行った割り当てsomeInstanceMethodによって保持サイクルが発生しますか?
(メモリ管理に ARC を使用しています。)

__weak id weakSelf = self;
[doWorkAndThen:^{
   [weakSelf someInstanceMethod];
}];

-(void) someInstanceMethod{
    //will either of the assignments below cause a retain cycle?
    self.iVar = @"data";
    [self setIvar:@"data";
}
4

1 に答える 1

8

No.-someInstanceMethodはブロックではありません。あなたがそれを1つから呼び出しているという事実は無関係です。ブロック自体内の参照のみが保持を引き起こす可能性があり、ブロック内の唯一の参照は変数であるため、問題ありません。__weak

ちなみに、本当に気を紛らわせたい場合は、ブロックベースUIAlertViewのクラスを変更して、ビューが閉じられたときにすべてのブロックを破棄する必要があります。このように保持サイクルを作成しても、アラート ビューが消えるとすぐに自動的に解除されます。

于 2012-06-29T21:45:04.663 に答える