4

Xcode で Allocations インストルメントを使用して、作成されているが解放されていないオブジェクトを追跡しています。コードの実行に伴ってオブジェクト数が増加し、コール スタックを使用してオブジェクトが作成されている場所を確認できますが、オブジェクト参照がどこに保持されているかはわかりません。それらはサードパーティのライブラリに保持されていると思いますが、開発者は「いいえ、それはあなたのコードに違いない」と言います。コード内の参照を nil に設定していますが、オブジェクトは残ります。

4

2 に答える 2

1

各参照がいつでもどこにあるかを教えてくれるツールは存在しないと思います。ARC を使用しているため、私の経験では、参照サイクルに巻き込まれてメモリ リークが発生する一般的な方法が 2 つあります。

  1. クラス A には、クラス A の同じインスタンスへの強い参照を持つクラス B のインスタンスへの強い参照があります。
  2. ブロックは、キャプチャしたオブジェクトへの参照を暗黙的に保持します。したがって、1 つの明白な落とし穴は、オブジェクトが自己への参照を保持するブロックを保持する場合です。

例:

self.retainedBlock = ^{
    [self doSomething];
};

修理:

__weak id weakSelf = self;
self.retainedBlock = ^{
    id strongSelf = weakSelf;
    [strongSelf doSomething];
};
于 2013-11-17T11:45:07.123 に答える
-1

これは絶望的な策略ですが、あなたができることは次のとおりです。

  1. 影響を受けるオブジェクトの ARC を無効にします (または回避します。以下を参照してください)。
  2. ロギングretainを追加autoreleasereleaseます。
  3. ログを通じて既知の過剰保持オブジェクトを追跡します。

最も簡単な例:

- (void)release
{
    NSLog(@"%@ : %@", self, [NSThread callStackSymbols]);
    [super release];
}

(ただし、実際には、[NSThread callStackSymbols]たとえば によってインデックス付けされた辞書にメモリ管理呼び出し用の の配列を保持し[NSValue valueWithPointer:self]、次に lldb から、またはディスクに書き込むことによってアクセスする方がおそらくはるかに賢明です。データを手動で効果的にインデックス付けする必要があるのはなぜですか? ?)

おそらく、ARC を回避する最も簡単な方法は、追跡したいオブジェクトにログ メモリ管理メソッドをメソッド スウィズルできる、ARC を無効にした単一のクラスを作成することです。

于 2014-08-22T22:48:58.843 に答える