2012-01-11 56 views
1

我想從單獨的NOB文件中加載包含地圖視圖和2個按鈕的視圖。從nib加載視圖的iOS創建內存泄漏?

編輯:我應該提到我不能繼承一個UIViewController,因爲我不希望視圖以標準方式呈現(例如作爲模式)。我希望它只使用屏幕的四分之一,透明,並呈現爲一個彈出視圖。因此,UIVIewController不建議使用不會佔用整個屏幕的視圖,或者至少不會將其作爲標準模式視圖控制器或UINavigationController層次結構的控制器呈現。

不想使用UIViewController子類(Apple說不這樣做),我決定構建一個ContainerObject,NSObject的後代,它將處理連接和釋放。

在容器對象內部,我只有1個IBOutlet :(視圖)。我這種方式加載筆尖初始化函數內部:

- (id)init { 
self = [super init]; 
if (self) { 
    [[NSBundle mainBundle] loadNibNamed:"myNib" owner:self options:nil]; 
} 
return self; 

}

筆尖裏面有一種觀點,即在其內部具有一個MapView類,和兩個按鈕。作爲文件的所有者,我已經設置了Container對象的類,並且我已將「查看」插口連接到文件所有者的出口。筆尖加載正常,我可以加載它並將其視圖添加到我的子視圖。

self.currentLocationMapView = [[[CurrentLocationViewContainer alloc] init] autorelease]; 
self.currentLocationMapView.delegate = self; 
[self.view addSubview:self.currentLocationMapView.view]; 

問題在於釋放,因爲在容器對象被成功釋放,認爲不釋放裏面:

[self.currentLocationMapView.view removeFromSuperview]; 
self.currentLocationMapView = nil; 

我的自定義視圖的dealloc的消息,這在於容器對象從不被調用。我必須顯式調用[self.currentLocationMapView.view release]以便在需要時釋放它。

請注意,「self.currentLocationMapView.view」是我的視圖控制器中的容器對象。容器對象包含自定義視圖,該視圖又保存地圖視圖和2個按鈕。

+0

蘋果說,要繼承UIViewController。實際上如果你創建一個新的iphone應用程序。至少有一個UIViewController的子類。您的ContainerObject將爲自定義UIViewController的設計工作做好準備。 – JeanLuc 2012-01-11 10:27:51

+0

你能指點我們的Apple文檔說不要繼承一個UIViewController嗎? – 2012-01-11 10:31:02

+0

@JeanLuc:我知道。但是,我應該說我不想以標準的方式提出我的看法。我想把它作爲一個彈出窗口呈現。你可以在這裏看到這個人的答案:http://stackoverflow.com/a/4973203/737457我沒有時間在論壇中搜索它。但是:他是對的。如果你創建一個自定義的視圖控制器並且不按照它應該使用的方式使用它,它將不會收到它必須的視圖控制器消息,並且它會泄漏內存,因爲它會被釋放,但不會釋放它的視圖。 – csotiriou 2012-01-11 14:15:15

回答

1

由於沒有人回答這個問題,我自己也可以自己回答,因爲我找到了解決方案和其他一些有用的信息,同時搜索它。

我的問題的解決方案在我的應用程序中很難找到錯誤。不管這個bug是什麼,它都是特定於應用程序的,而不像其他應用程序中發生的那樣。對於UIViewControllers而言,您不應該使用UIViewControllers或其子類來使用Apple的Standard方法以外的其他方法來呈現視圖。永遠。如果你想向不屬於視圖層次結構的用戶提供一個視圖,例如UITabBarController或UINavigationController或類似的東西,那麼你必須以編程方式進行此操作,而不使用View Controller作爲此類的管理器對象。相反,您應該使用NSObject作爲視圖的管理器。

這是因爲UIViewController的內部保持對視圖和其他對象的引用,這些對象在調用UIViewController的某些方法時被釋放。如果不是Apple視圖層次結構的一部分,這些方法將永遠不會被調用,從而導致內存泄漏。