2017-11-03 5 views
-3

私はオブジェクト上でautoreleaseを呼び出すと、保持カウントを減少させ、最後にプール排水時にオブジェクトをオートリリースプールからクリアすると考えました。しかし、autoreleaseがオブジェクトに対して呼び出されると、実行時にどのようにクラッシュするのですか?誰もが例で説明することができます。オブジェクトに対してautoreleaseを呼び出すと、どうやって実行時にクラッシュするのですか?

+5

コードを表示できますか? ARCを使っていないのはなぜですか? – Paulw11

+0

autoreleaseは保持カウントを減少させません。オブジェクトを自動解放プールに入れます。 –

答えて

1

MRR/MRCでは、プログラマはオブジェクトの保持と解放を行います。リリース数がリリース数より多い場合、オブジェクトが存続し、リリース数が保持数と一致するとオブジェクトが解放され、その後にさらにリリースが行われるとクラッシュが発生することがあります。

自動解放は遅延リリースであるため、リリース缶のようにクラッシュする可能性があります。例えば。サンプルのタイムライン:

保持/作成したオブジェクト

使用目的

自動解放オブジェクト - 後で

を解放するために、プールに格納されているオブジェクトのオブジェクトを使用してください - 細​​かいことはまだ

生きているよう解放オブジェクト - オブジェクトは解放され、占有メモリは再利用できる。

...

プールが空になり、オブジェクトのポインタが解放され、リリースされたオブジェクトに参照されるようになりました。

これは単なるシナリオの1つです。オブジェクトをあまりにも多く(それが保持されている以上)自動オートリースする。

これはです。です。これを修正するには、マニュアルメモリ管理を慎重に検討するか、自動化してARCに切り替えて、手動でリークを回避してください。

0

Xcodeの "静的アナライザー"を使用すると、手動によるカウント保持の問題を追跡することができます。なぜあなたの記憶問題が発生するのかを説明します。それを実行し、あなたの問題を修正してください。

関連する問題