[解決済み] ブロックを使って `self` のサイクルを保持する
質問
この質問はかなり基本的なもので、恐縮ですが、ブロックに入りつつある多くのObjective-Cプログラマに関係するものだと思います。
ブロックは、その中で参照されるローカル変数を「ブロック」として捕捉するため、「ブロック」を「ブロック」と呼ぶと聞いたことがあります。
const
コピーを使用すると
self
をブロック内で使用すると、そのブロックがコピーされたときに、retain cycleが発生する可能性があります。ですから、私たちは
__block
を直接処理するようにブロックに強制します。
self
コピーされるのではなく
__block typeof(self) bself = self;
[someObject messageWithBlock:^{ [bself doSomething]; }];
ではなく、単に
[someObject messageWithBlock:^{ [self doSomething]; }];
私が知りたいのは次のようなことです。もしこれが本当なら、(GCの使用は別として)醜態をさらすことを避ける方法はあるのでしょうか?
どのように解決するのですか?
厳密には、constコピーであることはこの問題とは関係ありません。ブロックは、作成時に取り込まれたobj-c値を保持します。たまたま、const-copyの問題の回避策はretainの問題の回避策と同じです。
__block
のストレージクラスがあります。
いずれにせよ、あなたの質問に答えるなら、ここに本当の代替案はありません。もしあなたが独自のブロックベースのAPIを設計していて、そうすることに意味があるのなら、ブロックに
self
を引数として与えます。残念ながら、これはほとんどのAPIで意味をなさない。
ivarを参照する場合も全く同じ問題がありますので、ご注意ください。ブロック内でivarを参照する必要がある場合は、代わりにプロパティを使用するか、または
bself->ivar
.
追記:ARCとしてコンパイルする場合。
__block
は、retain cycles を壊さなくなりました。ARC用にコンパイルしている場合は
__weak
または
__unsafe_unretained
の代わりに
関連
-
[解決済み】Objective-C。NULL、nil、@""の違いは何ですか?
-
[解決済み] どのような場合に@synthesizeを明示的に使用する必要がありますか?
-
[解決済み] Objective-Cの#importと#includeの違いは何ですか?
-
[解決済み] カスタムオブジェクトを含むNSMutableArrayをソートするにはどうすればよいですか?
-
[解決済み] objective-c/cocoaで例外を投げる
-
[解決済み】キーボードを簡単に解除する方法は?
-
[解決済み】Objective-Cのブロックをプロパティとして使用することはできますか?
-
[解決済み】idの代わりにinstancetypeを使い始めるのは有益でしょうか?
-
[解決済み】このブロックで自己を強く捉えると、リテインサイクルになりそうです。
-
[解決済み】APIを実装する際に、ブロック内でselfをキャプチャしないようにするにはどうすればいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] .02fと%.2fの違いは何ですか?
-
[解決済み] iPhoneでObjective-Cはガベージコレクタを搭載しているのか?
-
[解決済み] arc4randomとarc4random_uniformの違いは何ですか?重複
-
[解決済み] NSDictionary または NSMutableDictionary にキーが含まれているかどうかを確認するにはどうすればよいですか?
-
[解決済み] objective-c/cocoaで例外を投げる
-
[解決済み】UITableViewControllerを使用しないUIRefreshControl
-
[解決済み】idの代わりにinstancetypeを使い始めるのは有益でしょうか?
-
[解決済み】Objective-Cでオブジェクトがどのクラスであるかをテストするにはどうすればよいですか?
-
[解決済み] [Solved] UITableViewがReloadDataを完了したことを伝えるには?
-
[解決済み】iOSでメールアドレスが有効であることを確認する【重複あり