Анализатор отмечает потенциальную утечку для этой конструкции

StackOverflow https://stackoverflow.com/questions/2392119

Вопрос

Со следующим кодом анализатор отмечает вызов селектора SETMYDICT в качестве потенциальной утечки, а в Dealloc IT-утверждения «Неправильное уменьшение ссылочного отчета не принадлежит в этой точке звонящего»

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

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

@synthesize myDict = _myDict;

Я не понимаю этого. Я думал, что с inloc init объект увеличивает удержание подсчета на один и указатель хранится в _mydict через синтезированное свойство. Если я использую этот код вместо

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

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

Анализатор не жалуется. Что мне не хватает?

Это было полезно?

Решение

@SynTheSize предоставляет вам сеттер и добиваться для объекта, который вы синтезируете.

Метод сеттера выглядит что-то вроде этого (взято из Apple Docs)

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

Вы создаете утечку, когда вы делаете:

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

Потому что вы никогда не выпускаете недавно Alloc'd словарь.

Способ работать вокруг это:

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

Это заботится о утечке.

В методе Dealoc вы должны использовать:

[myDict release]; // Or whatever your property is called.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top