0

私は現在、別の開発者によって開始された iOS アプリケーションを開発しています。

通常、すべてのインスタンス変数のプロパティを作成します(int、boolなどに割り当て/すべてのクラスに保持)。

したがって、私のプロジェクトでは、この行でリークが発生します。

myVar = [[NSString alloc] init]; (alloc/init +1, retain in setter +1, release in dealloc -1 => +1)

だから私は使用します:

NSString *tmpMyVar = [[NSString alloc] init];
[self setMyVar: tmpMyVar];
[tmpMyVar release];

または:

NSString *tmpMyVar = [[[NSString alloc] init] autorelease];
[self setMyVar: tmpMyVar];

この新しいプロジェクトでは、以前の開発者は @property/@synthesize を使用していなかったので、このコンテキストで前のコード行の結果がどうなるか疑問に思っています (setter を呼び出していないと思います)。メモリーリーク?

前の開発者は私と同じように dealloc メソッドで変数を解放します。

どうもありがとうございました!

4

2 に答える 2

2

インスタンス変数を割り当てられたオブジェクトに直接割り当てるため、保持カウントは1です(あなたが言ったように、セッターが呼び出されないため)。そして、dealloc でリリースされるため、すべてバランスが取れています。したがって、メモリリークはありません。

したがって、私のプロジェクトでは、この行でリークが発生します。

myVar = [[NSString alloc] init]; (alloc/init +1、setter で保持 +1、dealloc で解放 -1 => +1)

いいえ、あなたが指摘したように、セッターが使用されていないため、プロジェクトでもそうではありません。

また、プロパティを使用する場合は、setter を使用する代わりに、init メソッドでインスタンス変数に直接アクセスすることをお勧めします。

あなたの例のような疑わしいメモリ リークを検査するには、clang 静的アナライザーまたは計測器のリーク ツールも使用します。

于 2012-08-21T09:02:47.353 に答える