ARC では、オブジェクトが解放されると、ポインターは nil に設定されます。
オブジェクトは、解放されようとしていることをこれらすべてのポイントにどのように伝えますか?
これは強いポインターまたはすべてのタイプのポインターで機能しますか?
ARC では、オブジェクトが解放されると、ポインターは nil に設定されます。
オブジェクトは、解放されようとしていることをこれらすべてのポイントにどのように伝えますか?
これは強いポインターまたはすべてのタイプのポインターで機能しますか?
ARC が Objective-C ランタイムに追加する必要があるものを簡単に読んだ結果に基づいて、弱参照自体がランタイムに登録されます。弱い接続を設定し、切断し、再割り当てするための呼び出しが多数あります。コンパイラは、自動的に保持および解放する役割も持っているのと同じように、どのような種類の代入を行うかを決定するように機能します。リンクされたドキュメントごと:
ランタイムは、null 以外の値を保持する __weak オブジェクトを追跡します。objc_storeWeak、objc_destroyWeak、または objc_moveWeak 呼び出しによる場合を除いて、ランタイムによって追跡されている __weak オブジェクトを直接変更することは未定義の動作です。
そのことから、ランタイムは、現在特定のオブジェクトを指しているすべてのウィーク ポインターのコレクションを保持していると結論付けます。そのオブジェクトの割り当てが解除されると、ポインターがゼロになります。
そのため、オブジェクトごとに、関連するポインターを指すリストがあり、双方向の接続を作成します。それがどこにどのように格納されるかは明示されていません。既存のオブジェクト関連付けメカニズムを介して格納される可能性があり、グローバル ディクショナリである可能性もあります。
ARC (または MRC) では、オブジェクトが解放されたときにポインターは nil に設定されません。ARC では、weak
オブジェクト参照はnil
、オブジェクトが解放されたときではなく、割り当てが解除されたときに設定されます。ここに大きな違いがあります。