2011-09-11 2 views
0

정적 분석기를이 코드와 같이 '만들 수는 없지만 동시에 컨트롤러에 저장되는 객체를 자동으로 풀 수 없으므로 호출자에게는 쓸모가 없습니다. 이 2 가지 정적 메서드를 사용하여 어떤 뷰 (탭을 차단하지 않고도) 위에 액티비티 컨트롤러를 더 쉽게 표시하려고했습니다.메모리 누수 가능성;

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를 너무 많이 위반하는) 이러한 방법의 본문에있는 것을 쓰는 것입니다.

+0

수없는 이유는 당신이 자동 해제 ** [컨트롤러 오토 릴리즈] **? 추락할까요? –

+0

호출자가 + remove를 호출 할 때까지 객체는 이미 autorelease 풀에서 해제되었습니다. – Tatsh

답변

2

규칙 (예 : 규칙)이 있습니다. - 미공개 객체가 초기화되지 않습니다. & 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]; 
+0

나는 분석기를 행복하게 만들었다. 현재 문제는 발견되지 않았습니다. 기능은 모두 제대로 작동합니다. – Tatsh

+0

@ Tatsh, 오신 것을 환영합니다;) – kovpas