Статический анализатор перестал обнаруживать невыпущенные выделения - PullRequest
0 голосов
/ 03 января 2012

Я использую Xcode 4. Вот огромная утечка памяти, которая, как я полагаю, является одним из самых простых способов поиска статического анализатора:

-(void)leak:(id)sender{
 images=[[NSMutableArray alloc] init];
 for (int i=0; i<=2000; i++) { 
     UIImage *image=[[UIImage alloc] initWithContentsOfFile:[[NSBundle   
 mainBundle]pathForResource:@"Icon" ofType:@"png"]];
     [images addObject: image];
 }
}

Но когда я выбираю Product | Analyze, анализатор ничего не ловит. Я сделал какие-либо непреднамеренные изменения в Xcode? Или это так и должно быть?

1 Ответ

0 голосов
/ 04 января 2012

ОК, вот что я получил, попробовав много вариантов.В приведенном выше коде, в вопросе, я выделяю изображение, а затем помещаю изображение с счетом сохранения +1 в массив изображений, который, в свою очередь, также сохраняет изображение, что приводит к счету сохранения +2.В идеале мне нужно было выпустить объект изображения после добавления его в массив.Но я не знаю, что является очевидной утечкой памяти.Но странный статический анализатор не может уловить эту утечку.Теперь вот подвох.Код находится в цикле for.Если я помещу это вне петли, анализатор обнаружит это.Так что я думаю, что это связано с оптимизацией компиляции, которая не замечает опасности внутри цикла.

И вот еще одна проблема.Хотя анализатор может обнаружить утечку, если я проверю ее на приборах, утечка все равно не будет обнаружена.Также странно, не правда ли?Хорошо, вот почему.Это потому, что инструменты не показывают утечки, если есть какая-либо ссылка на объект.Итак, я даю вам два случая для сравнения:

  images=[[NSMutableArray alloc] init]; 
  UIImage *image=[[UIImage alloc] initWithContentsOfFile:[[NSBundle   
  mainBundle]pathForResource:@"Icon" ofType:@"png"]];
  [images addObject: image];

Таким образом, статический анализатор обнаружит утечку памяти (обратите внимание, что код не находится внутри цикла).Но инструментов не будет.Но если я добавлю еще одну строку кода:

  images=[[NSMutableArray alloc] init]; 
  UIImage *image=[[UIImage alloc] initWithContentsOfFile:[[NSBundle   
  mainBundle]pathForResource:@"Icon" ofType:@"png"]];
  [images addObject: image];

  [images release];

, тогда не будет объекта, владеющего объектом изображения, поэтому он будет плавать вокруг.Таким образом, инструменты также обнаружат утечку.

Я знаю, что описанный выше случай практически невозможен в реальных приложениях, но это пример для демонстрационных целей, чтобы вы не запутались.

PS Я действительно не пытался отключитьоптимизация компиляции (если она существует вне курса.).Но я видел видео, где статический анализатор также обнаруживает утечку памяти внутри цикла.Иди ищи его, если тебе интересно.

...