1

boost C++ では、ウィーク ポインターは、共有 (参照カウント) ポインターへのオブザーバーとして実装されます。

Objective-C ではどのように実装されていますか? また、なぜランタイム サポートが必要なのですか? (つまり、コンパイラのサポートに加えて、弱参照を使用するには iOS 5 以降が必要です)

4

2 に答える 2

3

Objective-C の弱い参照はnil、それらが指すオブジェクトの割り当てが解除されたときに に設定されます。これは非常に便利です (参照サイクルを解決し、割り当て解除されたオブジェクトへのメッセージの送信を回避できます) が、ランタイムがオブジェクトへのすべての弱い参照を追跡する必要があり、オブジェクトが最終的に割り当て解除されたときに、ランタイムはそれらの参照をゼロにする必要があります。

これらはどちらも、Objective-C ランタイムによってのみ透過的に実行できます。Objective-C には、この種の魔法を独自のコードに実装するための C++ と同じ柔軟性はありません。

于 2012-10-12T13:52:07.713 に答える
3

std::weak_ptr には、実際には、簿記データと参照されるオブジェクトを保持する共有データ構造へのポインターが含まれています。参照されたオブジェクトが破棄された場合、この共有データは保持されるため、weak_ptrs はオブジェクトがなくなったことを示す簿記データを確認できます。また、参照されたオブジェクトの割り当てが解除されたときに、weak_ptrs 自体を変更する必要はありません。

Objective-C では、弱参照は簿記データを保持する中間オブジェクトを指しません。これらは、実際に参照されるオブジェクトを指す通常のポインタであるか、参照されるオブジェクトがなくなった場合は nil を指します。すべての __weak ポインターは、コードの他の部分がオブジェクトへの最後の非弱いポインターを解放するときに更新する必要があります。これにはランタイム サポートが必要です。

つまり、Obj-C の弱いポインターは、(ランタイム サポートを使用する) コンパイラ マジックが動作することを除けば通常のポインターですが、shared_ptrs と weak_ptrs は、独自のランタイム サポートを実装する単なるラッパーです (スマート ポインターのコンストラクター、代入演算子で)。 、デストラクタなど) ポインターの周り。

于 2012-10-12T14:52:45.993 に答える