1. ホーム
  2. アイオス

[解決済み】Objective-Cの自動参照カウントでは、どのようなリークを防いだり最小化したりできないのですか?

2022-04-04 15:10:34

質問

MacやiOSでは、メモリリークの原因は未解放のポインタであることが多いようです。従来から、allocs、copy、retainをチェックして、それぞれに対応するreleaseメッセージがあることを確認することが最も重要でした。

Xcode 4.2に付属するツールチェーンは、自動参照カウント(ARC)を導入し、最新バージョンの LLVMコンパイラ これは、コンパイラにメモリ管理をさせることで、この問題を完全に解決するものです。これはとてもクールなことで、不必要で平凡な開発時間を大幅に削減し、不注意によるメモリリークを防ぐことができます。MacとiOSのアプリでARCを有効にすると、オートリリース・プールも異なる方法で管理する必要があります(自分自身の NSAutoreleasePool を使用するようになりました。)

しかし、何 その他 メモリリーク ではなく というのは、まだ気をつけなければならないのでしょうか?

おまけで、Mac OS XとiOSのARCの違い、Mac OS Xのガベージコレクションについて教えてください。

解決するには?

メモリ関連の問題で、やはり気をつけなければならないのは、リテインサイクルです。 これは、あるオブジェクトが別のオブジェクトへの強いポインタを持っていて、ターゲットオブジェクトが元のオブジェクトへの強いポインタを持っている場合に発生します。 これらのオブジェクトへの他のすべての参照が削除されても、オブジェクトは互いに保持され、解放されることはありません。 この現象は、オブジェクトの連鎖によって間接的に起こることもあり、連鎖の最後のオブジェクトが以前のオブジェクトを参照している可能性があります。

このような理由から __unsafe_unretained__weak 所有権修飾子が存在します。 前者は指すオブジェクトを保持しませんが、そのオブジェクトが消えてバッドメモリを指す可能性を残しています。一方、後者はオブジェクトを保持せず、ターゲットが解放されると自動的にnilをセットします。 この2つのうち __weak をサポートしているプラットフォームでは、一般にこの方法が好まれます。

これらの修飾子は、デリゲートのように、オブジェクトがデリゲートを保持し、潜在的に循環を引き起こすことを望まない場合に使用されます。

メモリに関するもうひとつの重要な懸念は、Core Foundation オブジェクトの処理と malloc() のような型に対して char* . ARCはこれらの型を管理せず、Objective-Cのオブジェクトだけを管理するので、やはり自分で処理する必要があります。 Core Foundation の型は特に厄介で、Objective-C のオブジェクトと一致するように橋渡しする必要があったり、その逆もあります。 つまり、CF型とObjective-Cをブリッジする際に、ARCから前後に制御を転送する必要があります。このブリッジングに関連するキーワードがいくつか追加され、Mike Ashが様々なブリッジングのケースについて、以下のように説明しています。 彼の長大なARCの記事 .

これ以外にも、頻度は低いものの、潜在的に問題となるケースがいくつかあり、その場合は 公開仕様 が詳しく説明されています。

オブジェクトへの強力なポインタがある限りオブジェクトを保持するという新しい動作の多くは、Macのガベージコレクションに非常によく似ています。 しかし、技術的な基盤は非常に異なっています。 ガベージコレクタプロセスが定期的に実行されて、指されなくなったオブジェクトをクリーンアップするのではなく、このスタイルのメモリ管理は、Objective-Cで遵守する必要のある厳格なretain/releaseルールに依存しています。

ARCは、私たちが何年もかけて行ってきたメモリ管理の繰り返し作業を、コンパイラにオフロードするだけで、二度と心配する必要がありません。 この方法では、ガベージコレクションプラットフォームで経験するような停止問題やのこぎり歯のようなメモリプロファイルは発生しません。 私は、ガベージコレクションのMacアプリケーションでこの2つを経験しており、ARCでどのような挙動を示すか見てみたいと思っています。

ガベージコレクションとARCの比較については、以下を参照してください。 Objective-CメーリングリストでのChris Lattnerによる非常に興味深い回答です。 彼は、Objective-C 2.0のガベージコレクションに対するARCの多くの利点を挙げています。 私は、彼が説明したGCの問題のいくつかに遭遇したことがあります。