Потенциал утечки памяти; не может использовать авто-релиз с UIViewController - PullRequest
0 голосов
/ 11 сентября 2011

Я не могу сделать статический анализатор «похожим» на этот код, но в то же время я не могу автоматически высвобождать объект, который сохраняется в контроллере, поэтому он бесполезен для вызывающей стороны.Этими двумя статическими методами я попытался упростить отображение контроллера активности в любом представлении (без блокирования вкладок).

PZActivityOverlayController *view = [PZActivityOverlayController displayOverView:self.view];
// Later on, when complete
[PZActivityOverlayController remove:view];

Исходный код:

+ (PZActivityOverlayController *)displayOverView:(UIView *)aView {
  PZActivityOverlayController *controller = [[PZActivityOverlayController alloc] initWithFrame:aView.superview.bounds labelText:@"Loading"];
  [controller viewWillAppear:YES];
  [aView.superview insertSubview:controller.view aboveSubview:aView];
  return controller; // Potential leak of object stored into controller
}

+ (void)remove:(PZActivityOverlayController *)display {
  [display viewWillDisappear:YES];
  [display.view removeFromSuperview];
  [display release]; // However it won't leak because it gets released here
 }

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

1 Ответ

2 голосов
/ 11 сентября 2011

Есть правило (скажем, соглашение) - неавторизованные объекты возвращаются методами alloc & init ..., new, retain, copy. Все остальные методы ДОЛЖНЫ возвращать автоматически освобожденный объект.

В вашем случае я бы переписал код выше:

....
    return [controller autorelease];
}

+ (void)remove:(PZActivityOverlayController *)display {
    [display viewWillDisappear:YES];
    [display.view removeFromSuperview];
}

...

PZActivityOverlayController *view = [[PZActivityOverlayController displayOverView:self.view] retain];
// Later on, when complete
[PZActivityOverlayController remove:view];

[view release];
...