Анализатор отмечает потенциальную утечку для этой конструкции
-
25-09-2019 - |
Вопрос
Со следующим кодом анализатор отмечает вызов селектора 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.