1

私はObjectiveCでメモリがどのように管理されているかを理解する必要があります。基本を知っています。メモリを作成して所有する場合は、自分で解放する必要があります。ただし、次のようなコードに到達した場合:

self.storeDict = [NSMutableDictionary dictionaryWithContentsOfFile:plistPath2];

私はこれを所有していますか?このメモリを解放する必要がありますか?

self.storeDict = [NSMutableDictionary dictionaryWithContentsOfFile:plistPath2]; 
//73.3% leak   
totalCharacters = [storeDict count];
tagCounter = 1;

dictKeyArray = [[storeDict allKeys] mutableCopy];
//13.3% leak

Instrumentsがハイライトされたリークの隣にたくさんのパーセンテージを置くとき、それは私に何を伝えますか?リークされたメモリの総量に対するリークのサイズを教えてくれますか?
そして最後にもう1つ..割り当てられたメモリの量が継続的に増加するのは正常ですか?それともどこかで安定する必要がありますか?すべての助けをありがとう!すべてが大歓迎です!

4

1 に答える 1

2

ほとんどの場合、名前が「alloc」、「new」、「copy」、または「mutableCopy」で始まるメソッドによって返されるオブジェクトのみを所有します。もちろん、送信先のものもすべて所有しています-retain。これらの規則の例外は、非準拠のメソッドのドキュメントで呼び出される必要があります。

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html#//apple_ref/doc/uid/20000994-SW1を参照してください。

Instruments は、オブジェクトが作成された行にリークがあると考えています。ただし、それは必ずしもオブジェクトをリークしたコードではありません。オブジェクトへのポインターが他のコードに渡され、そのコードがその保持と解放のバランスを取っていなかった場合、そのコードがリークの原因です。計測器は、特定のオブジェクトの保持と解放の履歴を表示できます。それらを確認して、所有権の責任を適切に果たしていないコードを確認する必要があります。

また、オブジェクトが別のオブジェクトによって所有されていて、実際にリークされたのがその 2 番目のオブジェクトである場合、それが所有していたすべてのものは、いわば「推移的に」リークされます。したがって、リークした低レベルのオブジェクトを追跡する前に、リークした高レベルのオブジェクトを探してください。多くの場合、リークされたオブジェクトのグラフのルートとなるのは、より少ない数のインスタンスをリークしたオブジェクトです。

記憶が上昇し続けるのが正常なのか、それとも安定するのが正常なのかは、少し異なります。通常、メモリ使用量は安定するはずです。ただし、アプリが実際にますます多くのことを行っている場合、メモリ使用量が増加し続けるのは正常な場合があります。たとえば、アプリがネットワーク経由でデータを受信し、その結果を蓄積している場合、より多くのデータが到着するにつれてメモリ使用量が増加する可能性があります。しかし、それが妥当な時点で止まらない場合、それは問題です。iOS デバイスでは、システムは最終的にそれを強制終了します。

于 2012-06-04T21:17:41.660 に答える