Intereting Posts
Вызов метода другого класса (например, с помощью одноэлементного класса)? Вызывается ли клавиатурная клавиатура при подключении к клавиатуре Bluetooth? Adcolony не удалось найти видимый в настоящее время UIViewController Константы доступа в классе без экземпляра класса в ObjectiveC Уравнение фильтра высоких частот от акселерометра iOS не возвращает хороших результатов как получить индекс выбранного текста из UITextField в swift 3? Как получить уведомление, когда контроллер просмотра поп или вставляется в стек навигационного контроллера Каков самый быстрый и эффективный код, способный вытащить номер из NSString? UINavigationView не может поп-музыки, только анимация всплывающих подсказок, UIViewController не изменена Почему в моем регулярном выражении несколько групп захвата разбивают мое приложение? iPhone: Как управлять 130 изображениями в ImageView? Основные данные рефлексивные для многих Assets.car не может быть прочитан в Application Loader 2D-поворот opengl вызывает искажение спрайтов Запись видео с помощью AVCaptureSession

Как очистить статический анализатор Clang, когда что-то не просачивается?

При использовании статического анализатора 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]]; } } 

Clang ошибается при линейном распределении и прямой ассоциации PaxCompartimentOutputField . При запуске этого кода в инструментах он не течет.

Два способа, которые я мог бы решить, это:

  1. использовать autorelease
  2. замените выделение в строке следующим кодом:

(код)

 PaxCompartimentOutputField *field = [[PaxCompartimentOutputField alloc] initWithPerson:passenger]; [paxCompartiments addObject:field]; [field release]; 

Первый вариант – устаревший imho (и особенно в iOS его использование не рекомендуется). Второй вариант довольно громоздкий – особенно при создании массива с большим количеством объектов (например, 10 объектов, загружающих настройки по умолчанию).

Я не хочу игнорировать предупреждения Клана, так как это отличный инструмент для поиска ошибок и утечек. Каков «правильный» способ сделать это в Objective-C для этих случаев?

Это утечка.

Поскольку вы выделяете-init PaxCompartimentOutputField , вы владеете им, и вы должны отказаться от права собственности на него.

У вас есть 3 варианта (вы уже упоминали 2 из них):

1) Используйте конструктор удобства , когда он доступен, или в пользовательском классе, объявите его. Конструкторы autorelease возвращают объекты, которым вы не владеете , обычно отправляя сообщение autorelease на возвращаемый объект. Это будет выглядеть так:

 [paxCompartiments addObject:[PaxCompartimentOutputField paxCompartimentOutputWithPerson:passenger]]; 

2) Используйте autorelease .

 [paxCompartiments addObject:[[[PaxCompartimentOutputField alloc] initWithPerson:passenger]] autorelease]; 

3) Используйте временную переменную.

 PaxCompartimentOutputField *tempField = [[PaxCompartimentOutputField alloc] initWithPerson:passenger]; [paxCompartiments addObject:tempField]; [tempField release]; 

Существует список исходных аннотаций, которые вы можете использовать с Clang.

Это может помочь.