ARC の出現により、開発者が弱参照オブジェクトを操作できるようにするために、いくつかの新しい関数が利用可能になりました。id objc_loadWeak(id *location)
その一つです。この関数は、弱いオブジェクトが格納されたメモリ内の場所に対応する 1 つのパラメーターを受け取り、このオブジェクトがまだ生きている場合、またはnil
割り当てが解除された場合に、このオブジェクトを返します。
オブジェクトがの場所にobj
として格納されている場合、をキーとして「弱いマップ」に配置されているようです。ただし、 を取得するには、 をキーとして使用し、 に対応する値を返すだけではありません。また、生きていない場合に戻るには、まだ生きているかどうかを確認する必要があります。weak
location
id objc_storeWeak(id *location, id obj)
obj
location
obj
objc_loadWeak
location
obj
obj
nil
ただし、objc_loadWeak
オブジェクトの割り当てが解除されている可能性があるため、オブジェクトの保持カウントを読み取ることはできません。さらに、ウィーク マップ、objc_storeWeak
、objc_loadWeak
およびNSObject
クラスは同じファイル ( NSObject.mm ) に実装されていますが、NSObject
のdealloc
メソッドは、割り当てが解除されているオブジェクトがなくなることをウィーク マップに通知しません。
weak
では、Objective-C ランタイムは、オブジェクトがまだ生きているかどうかをどのように判断するのでしょうか?