2016-07-19 4 views
0

実行時の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とは何の関係もないはずの私の記述を修正し、それが実行時に参照カウントについての詳細です。

+0

これはARCのようには聞こえませんが、オートリリースプールのように聞こえます。 – rmaddy

+0

@rmaddy実際には実行時のARCの基本的なメカニズムです。そうでなければ、システムは各オブジェクトの保持カウントをどのように追跡しますか?いくつかのデータ構造のどこかに保持カウントを格納して、チェックして操作できるようにする必要があります。 'ARC'テーブルを使用していますが、いつですか?それは私の質問です。 – Boris

+0

いいえ、保持カウントの追跡はARCとは関係ありません。オブジェクトはARCの手前で保持カウントを保持していました。 ARCが追加するのは、コンパイラによる 'retain'と' release'への呼び出しの自動挿入だけです。 ARCとMRCコードは実行時に同じです。オブジェクトの保持カウントがゼロになると、オブジェクトは保持されなくなります(ARCまたはMRC)。 – rmaddy

答えて

0

この種の動作はガベージコレクションのように聞こえ、ARCの仕組みとは厳密には一致しません。

ARCの動作は完全に確定的です。オブジェクトへの参照の数を追跡し、そのカウントが0になるとすぐにオブジェクトの割り当てが解除されます。実装の詳細hereについて読むことができます。

+0

コンパイル時にARC/MRCが何をするのか理解していますが、iOSは実行時にメモリー管理のために表面下で何をしますか?使用されたすべてのメモリと参照カウントを記録するテーブルはありませんか?とにかく 'table'は本から読み込まれます。 – Boris

+2

-releaseが呼び出されると、ランタイムは参照カウントをチェックします。あなたが思っているように、参照カウントをポーリングしません。 – caughtinflux

+1

この回答は誤解を招くことです。 ARC特有のものではありません。この説明はMRCにも同様に適用されます。 – rmaddy

関連する問題