1

〜最後の強力なポインタが削除された後、ARCは常にオブジェクトをその行から解放しますか?それとも未定で、将来の不特定の時点でリリースされる予定ですか?同様に、プログラムで何も変更しないと仮定すると、プログラムを実行およびコンパイルするたびにARCは常に同じになりますか?

〜オブジェクトを他のクラスに渡すことにどのように対処しますか?たとえば、クラスにCakeオブジェクトを作成するとします。Bakeryこのプロセスにはおそらく長い時間がかかり、さまざまな方法が必要になるため、ケーキをに入れるのが妥当な場合がありますstrong property。ここで、このケーキオブジェクトを顧客に渡したいとします。顧客はまた、おそらくそれへの強力なポインタを持ちたいと思うでしょう。これでいい?同じオブジェクトへの強力なポインタを持つ2つのクラスがありますか?Bakery'sそれとも、渡すとすぐにポインタをゼロにする必要がありますか?

4

5 に答える 5

3
  1. コードは、これに対する答えが重要ではないように構造化する必要があります-オブジェクトを使用する場合は、オブジェクトへのポインターを保持し、ARCの副作用に依存しないでください:)そしてこれらの副作用は次のように変わる可能性がありますさまざまなコンパイラ。

  2. 2つの強力なポインタは絶対に問題ありません。ARCは、両方のポインターが他の何か(または何も!)を指している場合にのみオブジェクトを解放します。

于 2012-06-20T17:50:49.083 に答える
0

さて、最初にこの答えはあなたにも少し役立つかもしれません:自動リリ​​ースのARC同等物?

通常、最後の強い変数が削除された後、オブジェクトはすぐに解放されます。プロパティに格納する場合は、プロパティをnilして、__ strong Foo * temp=self.bar;のようなものに割り当てることができます。nilする前に、そのローカル__strong変数を返します(ただし、arcは通常、戻りを検出し、__ strongを自分で推測します)。

その詳細:ARCでのポインター間の所有権の問題の処理

于 2012-06-20T17:41:08.473 に答える
0
  1. ARCは、コンパイル時に適切な保持とリリースを実装します。自分で配置した場合と同じように動作するため、常に同じコンパイルが実行され、質問に答える場合は常に同じように動作する必要があります。ただし、ポインタが削除された直後にオブジェクトが常に解放されるという意味ではありません。いかなる形式のObjectiveCでもDeallocを直接呼び出すことは決してないため、参照カウントがなく、解放しても安全であることを伝えているだけです。これは通常、すぐにリリースされることを意味します。

  2. あるクラスから別のクラスにオブジェクトを渡し、受信クラスに強力なプロパティが関連付けられていて、それを渡すクラスが最終的にポインタを無効にした場合でも、参照カウントは少なくとも1であり、問​​題ありません。

于 2012-06-20T17:42:50.963 に答える
0

DeanWombourneの答えは正しいです。ただし、(1)に追加します。

特に、コンパイラーは、最適化の一部としてステートメントを大幅に並べ替えることがあります。メソッド呼び出しは常にコードで記述された順序で発生しますが(メソッド呼び出しには副作用がある可能性があるため)、アトミック式は、その並べ替えが動作に影響を与えない限り、コンパイラーによって並べ替えることができます。ローカル変数の再利用などにも同じことが言えます。

したがって、ARCコンパイラは、ポインタが必要な限り有効であり、それ以上有効でないことを保証します。ただし、ポイントされたオブジェクトがいつリリースされるかは、宣言の範囲を超えて発生しないという保証はありません。また、Aが宣言され、最後にBの前に使用されたという理由だけで、オブジェクトAがBの前に解放されるという保証もありません。

言い換えれば、副作用や競合状態に依存せずにコードを記述している限り、すべてが正常に機能するはずです。

于 2012-06-20T17:55:47.040 に答える
-1

異なるコンパイラーでは異なる動作をするため、コードを適切に保管してください。

ここに画像の説明を入力してください

于 2016-03-14T10:35:03.253 に答える