実行時のiOSでオブジェクトのアドレスをキーとし、そのオブジェクトの保持カウントを値として持つhashtable
を保持しています(坂本和樹と古本智彦が書いた本から)。以下のように実行時にiOSチェックでカウントテーブルを保持するのはいつですか
:
key(object's addr) value(reference count)
0x7fff59a7ba88 2
0x7fa84b4b2c10 0
...
とiOSのランタイムは、いくつかのオブジェクトが解放されなければならないという意味、価値を持つ任意のキーがゼロに等しいかどうかを確認するためにしばらく一度テーブルをチェックします、そしてiOSのは、そのキーと値のペアを削除しますテーブルから呼び出してdealloc
に呼び出してオブジェクトのメモリを解放します。
この理論が正しい場合、私の質問は、どの周波数システムがreference count hashtable
をいつチェックするのかということです。それぞれrunloop
?またはiOSはテーブルを一切チェックしませんが、自動的に行われます。
UPDATE:
私はちょうどARCまたはMRCとは何の関係もないはずの私の記述を修正し、それが実行時に参照カウントについての詳細です。
これはARCのようには聞こえませんが、オートリリースプールのように聞こえます。 – rmaddy
@rmaddy実際には実行時のARCの基本的なメカニズムです。そうでなければ、システムは各オブジェクトの保持カウントをどのように追跡しますか?いくつかのデータ構造のどこかに保持カウントを格納して、チェックして操作できるようにする必要があります。 'ARC'テーブルを使用していますが、いつですか?それは私の質問です。 – Boris
いいえ、保持カウントの追跡はARCとは関係ありません。オブジェクトはARCの手前で保持カウントを保持していました。 ARCが追加するのは、コンパイラによる 'retain'と' release'への呼び出しの自動挿入だけです。 ARCとMRCコードは実行時に同じです。オブジェクトの保持カウントがゼロになると、オブジェクトは保持されなくなります(ARCまたはMRC)。 – rmaddy