2

記録されたヒープショットの永続的なメモリがゼロにならず、同じ一連の操作が継続的に繰り返されるとヒープが成長し続けるため、アプリがメモリを放棄しているようです。 ここに画像の説明を入力

問題を見つけるために、私は ARC を使用しているため役に立たないBill のサイトを多くの人が提案していますが、 Bill は参照の問題を指摘しています。次に、Apple のドキュメントに従い、WWDC の放棄されたメモリに関するビデオをいくつか見ました。彼らは皆、計測器が問題を引き起こす可能性のあるコード行を指摘するのに役立つと言っています。そのため、すべてのオブジェクトを確認しましたが、コードに関連するものは何も見つかりませんでした:

ここに画像の説明を入力

4

3 に答える 3

3

保持サイクルを明示的に探す必要があると思います。階層内に、関連オブジェクトを持つ親オブジェクト オブジェクトがあり、両方に強い型のプロパティがある場合、それらはメモリから解放されません。

簡単な例:

@interface Parent : NSObject
@property (strong) Child *child;
@end
@interface Child : NSObject
@property (strong) Parent *parent;
@end

また、プロパティはデフォルトでstrongなので、何も宣言しなくても同じです。

それがあるべき方法:

@interface Parent : NSObject
@property (strong) Child *child;
@end
@interface Child : NSObject
@property (weak) Parent *parent;
@end

また、Instruments がサイクルを保持していることを示すことができるという情報も見つけました (そして、それは良さそうです)。詳細はこちらARC の下のインスツルメントでサイクル レポートを有効にする方法は? ただし、ARC で動作するかどうかはわかりません。コメントは、動作しないことを示唆している可能性があります。面倒な方法として、責任があると思われるコードをコメントアウトしてから、画像を確認することをお勧めします。


これが保持サイクルです。もう 1 つ確認する必要があるのは、ARC が返すことができないメモリを割り当てる場合です。これらの呼び出しは C 関数のように見え、慣例により名前に Create という単語が含まれています。そのようなポインターを作成するたびに、自分自身もきれいにする必要があります。いくつかの例を挙げると:

  • CGColorCreate - CGColorRelease
  • CGColorSpaceCreateWithName - CGColorSpaceRelease
  • CGBitmapContextCreate - CGContextRelease

ご覧のとおり、各関数には対応する解放関数があり、通常はドキュメントで見つけることができます。

于 2012-11-27T09:25:10.663 に答える
1

Build Settings\Build Options\Debug Information FormatDWARFからDWARF with dSYM Fileに変更すると問題が解決するようです。

ここに画像の説明を入力

于 2012-12-10T04:07:45.957 に答える
0

または、ゾンビをオンにしてテストしています (スキームの編集 - 診断)。ゾンビがオンになっている場合、それらは決して削除されないため、メモリは常に増加します。

于 2012-11-27T19:36:54.833 に答える