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 对象将保留计数增加一,并且指针通过综合属性存储在 _myDict 中。如果我改用此代码

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

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

分析仪没有抱怨。我错过了什么?

4

1 回答 1

5

@synthesize 为您正在合成的对象提供了 setter 和 getter。

setter 方法看起来像这样(取自 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 回答