При использовании статического анализатора Clang для анализа моего кода Objective-C для iOS я получаю много «потенциальных утечек». Многие утечки заставляют меня задуматься, почему это вообще ошибочно. В частности, меня особенно поразил один пример:
У меня есть переменная класса типа NSDictionary
, используемая для хранения некоторых настроек. Теперь, когда у меня есть способ изменить что-то внутри словаря:
- (void) loadPassengerCompartiments {
NSMutableArray *paxCompartiments = [self.outputTable objectAtIndex:2];
NSArray *paxCompSrc = [self.values objectForKey:@"PassengerCompartiments"];
for(MassPerson *passenger in paxCompSrc) {
=> [paxCompartiments addObject:[[PaxCompartimentOutputField alloc] initWithPerson:passenger]];
}
}
Лежит при линейном распределении и прямой ассоциации PaxCompartimentOutputField
.
При запуске этого кода в инструментах он не протекает.
Два способа, которыми я мог придумать, чтобы решить это:
- использование
autorelease
- заменить встроенное распределение следующим кодом:
(код)
PaxCompartimentOutputField *field = [[PaxCompartimentOutputField alloc] initWithPerson:passenger];
[paxCompartiments addObject:field];
[field release];
Первый вариант устарел imho (и особенно на iOS его использование не рекомендуется)
Второй вариант довольно громоздкий - особенно при создании массива с большим количеством объектов (например, 10 объектов загружают настройки по умолчанию).
Я не хочу игнорировать предупреждения Clang, так как это отличный инструмент для поиска ошибок и утечек. Каков «правильный» способ сделать это в Objective-C для этих случаев?