[解決済み】Objective-Cの自動参照カウントでは、どのようなリークを防いだり最小化したりできないのですか?
質問
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の問題のいくつかに遭遇したことがあります。
関連
-
[解決済み] Xcode コマンド /usr/bin/codesign は終了コード 1 で失敗しました : errSecInternalComponent
-
[解決済み] CFNetwork SSLHandshakeに失敗しました(-9824) NSURLSession/NSURLConnection HTTPのロードに失敗しました(kCFStreamErrorDomainSSL, -9824)
-
[解決済み] シミュレータへのサービス接続の開始に失敗しました Xcode
-
[解決済み] iPhoneが使用できません。デバイスを再接続してください
-
[解決済み] UITabBar アイコンが正しく表示されない
-
[解決済み] Xcode Simulatorのアニメーションをエディタで再生すると、極端に遅くなる。
-
[解決済み] iOS Swift 3 - UIDatePicker
-
[解決済み】新しい自動リファレンスカウント機構はどのように機能するのですか?
-
[解決済み】ARCで@autoreleasepoolがまだ必要なのはなぜですか?
-
[解決済み] 一部のファイルに対する自動参照カウントの無効化
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】iOS 9.0より前のUIStackView
-
[解決済み] swiftで「floor」が使用できない
-
[解決済み] Info.plist ユーティリティのエラーです。"そのようなファイルがないため、Info.plistを開くことができませんでした"
-
[解決済み] 警告 xcode 6 で暗黙の変換により整数の精度が失われる
-
[解決済み] Swift の performSegueWithIdentifier が動作しない。
-
[解決済み] viewDidLoad()は何のためにあるのですか?[重複]する
-
[解決済み] Unwind segue - インスタンスメソッドのみ @IBAction を宣言でき、ボタンが Exit に接続しない
-
[解決済み] 'CGPointMake' は swift で使用できません [重複] 。
-
[解決済み] iOS Swift 3 - UIDatePicker
-
[解決済み】新しい自動リファレンスカウント機構はどのように機能するのですか?