2011-09-11 22 views
0
使用自動釋放

我不能讓靜態分析「喜歡」這樣的代碼,但在同一時間,我不能自動釋放該被存儲到控制器的對象,所以它是無用的調用者。使用這兩個靜態方法,我試圖讓在任何視圖上顯示活動控制器變得更加容易(不會阻止選項卡)。內存泄漏電位;不能用一個UIViewController

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

由當時的呼叫者電話+刪除,對象已經被自動釋放池釋放。 – Tatsh

回答

2

有一個規則(比如,約定) - nonautoreleased對象通過方法的alloc返回&初始化......,新的,保留,拷貝。其餘所有方法都必須返回自動釋放對象。

在你的情況我已經重寫上面的代碼:

.... 
    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