我想從單獨的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個按鈕。
蘋果說,要繼承UIViewController。實際上如果你創建一個新的iphone應用程序。至少有一個UIViewController的子類。您的ContainerObject將爲自定義UIViewController的設計工作做好準備。 – JeanLuc 2012-01-11 10:27:51
你能指點我們的Apple文檔說不要繼承一個UIViewController嗎? – 2012-01-11 10:31:02
@JeanLuc:我知道。但是,我應該說我不想以標準的方式提出我的看法。我想把它作爲一個彈出窗口呈現。你可以在這裏看到這個人的答案:http://stackoverflow.com/a/4973203/737457我沒有時間在論壇中搜索它。但是:他是對的。如果你創建一個自定義的視圖控制器並且不按照它應該使用的方式使用它,它將不會收到它必須的視圖控制器消息,並且它會泄漏內存,因爲它會被釋放,但不會釋放它的視圖。 – csotiriou 2012-01-11 14:15:15