Edited at
ゆめみDay 18

いまさらARCについて調べた

「循環参照しそうな時、@escapingなクロージャを記述する時以外はオーナーシップってあんまり気にしなくなってきたけど、そういやARCってどんな仕組みやっけ?」

と思ったので調べました。


ARCやGC以前

CやC++では、プログラマ自身がメモリ割り当てや解法を行う必要がありました。

ただ熟達したプログラマでも、使用済みのメモリを解放し忘れる。それが重なってメモリリークを起こす。というのはありがちだったそうです。(CやC++はあまり触ったことなくて体験談ではないので申し訳ないですが...


ARCとGC

前述の背景を踏まえて登場したのが、GCです

GCのおかげで、プログラム作成者が明示的にメモリの確保・解放を行う必要が無いため、メモリ管理に関連する陥りやすいバグを回避することができるようになったのですが、ガベージコレクタ自身がCPUを消費してしまう というデメリットがありました。

対してARCはコンパイル時に自動メモリ管理されます。

以下はAppleのドキュメントに書いてあった文章の抜粋です。


ARCはオブジェクトのライフタイム要件を評価し、コンパイル時に適切なメモリ管理呼び出しを自動的に挿入します。コンパイラは適切なdeallocメソッドも生成します。


これにより、実行時のパフォーマンスロスが極めて小さいという特徴があります。

ただ、あくまでメモリ管理呼び出しを自動的に挿入する仕組みなので、アセンブラレベルではretain, releaseしているのを確認できるそうです。


ARCまとめ

Automatic Reference Countingという名前通り、コンパイル時に(ここ重要)自動で参照をカウントする仕組みで、実行時のパフォーマンスロスが極めて小さい。というものでした。


Thanks

新人iOSエンジニアの質問に答えていただいた、社内の先輩方ありがとうございました!


参考

C,C++におけるメモリの扱い方について(初心編)

5分で分かるガベージコレクションの仕組み

ガベージコレクション-wikipedia

Transitioning to ARC Release Notes

で、結局ARCって何なの?

↑アセンブラでARC確認できる記事