0

次のコードを使用して、アナライザーはsetMyDictセレクター呼び出しを潜在的なリークとしてマークし、deallocで、「参照カウントの誤った減少は、この時点では呼び出し元によって所有されていません」と表示します。

- (id)init {
  if (self = [super init]) {
      [self setMyDict:[[NSMutableDictionary alloc] init]];
  }
  return self;
}

- (void)dealloc {
  [[self myDict] release];
  [super dealloc];
}

@synthesize myDict = _myDict;

ぜんぜんわかりません。alloc initを使用すると、オブジェクトは保持カウントを1つ増やし、ポインターは合成されたプロパティを介して_myDictに格納されると思いました。代わりにこのコードを使用する場合

- (id)init {
  if (self = [super init]) {
    _myDict = [[NSMutableDictionary alloc] init];
  }
  return self;
}

- (void)dealloc {
  [_myDict release];
  [super dealloc];
}

アナライザーは文句を言いません。私は何が欠けていますか?

4

1 に答える 1

5

@synthesize は、合成するオブジェクトのセッターとゲッターを提供します。

セッターメソッドは次のようになります (Apple ドキュメントから取得)

-(void)setMyDict:(NSMutableDictionary *)newDict {
    if (myDict != newDict) {
       [myDict release];
       myDict = [newDict retain];
    }
}

次の場合、リークが発生します。

[self setMyDict:[[NSMutableDictionary alloc] init]];

新しく割り当てられた辞書を決して解放しないためです。

これを回避する方法は次のとおりです。

NSMutableDictionary * dict = [[NSMutableDictionary alloc] init];
[self setMyDict:dict];
[dict release];

これで漏れは治ります。

dealloc メソッドでは、次を使用する必要があります。

[myDict release]; // Or whatever your property is called.
于 2010-03-06T10:22:57.267 に答える