我是iPhone開發新手,在從主窗口中刪除子視圖時遇到問題。問題是,即使在調用removeFromSuperview之後,視圖仍然顯示出來。爲什麼removeFromSuperview在我的iPhone應用程序中隱藏我的UIView?
子視圖中創建,並通過該代碼添加到顯示樹:
// Instantiate the controller for the authentication view
AuthenticationController* controller = [AuthenticationController alloc];
[controller initWithNibName:@"AuthenticationView" bundle:[NSBundle mainBundle]];
authController = controller;
// Add the authentication view to the window
[[stateManager appWindow] addSubview:[authController view]];
後來的後來,我已經驗證了這個碼是設置一個斷點運行,這是我是如何試圖刪除的觀點:
[[authController view] removeFromSuperview];
在如此重要的情況下,這裏的dealloc的代碼,不會針對該視圖控制器的所有者:
- (void)dealloc {
[authController release];
[super dealloc];
}
什麼導致這個子視圖繼續顯示?
這看起來不像應該工作。 'initWithNibName:'方法產生一個保留計數爲1的控制器。你爲它賦予'authController'(我假設它是一個實例變量)而不保留它。然後釋放它,將保留計數設置回零,並且應該釋放該對象。當你到達最後一行時,'authController'應該消失。 – 2010-02-03 05:09:00
我不認爲你的評估是正確的。 'authController'是一個保留引用的屬性。因此,在我有'[controller release]'之前,對象的保留計數爲2,因此''dealloc''期間的'release'沒有釋放對象。 – Jacob 2010-02-03 17:39:30
@Jacob - 這裏的修補是正確的。如果你打電話給self.authController = controller,你說的**會是真的。正如你所擁有的,你不是保留控制器,並且在訪問分配給authController的指針時將獲得無效的內存引用。 – DougW 2011-10-27 00:33:08