2010-12-07 162 views
5
UIPopoverController *historyPop = [[UIPopoverController alloc] initWithContentViewController:nav]; 
    [nav release]; 
    [historyPop setPopoverContentSize:CGSizeMake(400, 500)]; 
    [historyPop presentPopoverFromRect:CGRectMake(button.frame.origin.x, button.frame.origin.y, button.frame.size.width, 5) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES]; 
    //[historyPop release]; 

這是我當前的代碼,但分析器說可能是泄漏,這是(因爲發佈行被註釋掉)。但是,如果我取消註釋發行版,那麼應用程序崩潰,並說dealloc在popover上仍然可見,所以何時應該釋放popover控制器?UIPopoverController和內存管理

回答

5

正如在幾處提到的那樣,呈現彈出窗口的方法(從rect或工具欄按鈕中)不會保留彈出窗口。因此,您的呈現視圖控制器需要保存對它的引用並在適當的時候釋放它。

如上所述,您可以通過將呈現視圖控制器設置爲彈出窗口的代理來完成此操作。一個簡單的,如果稍微少一點的內存效率的方法是聲明一個retain屬性來保存UIPopoverController。創建彈出窗口時,將其分配給保留該窗口的屬性。如果您稍後創建另一個彈出窗口,則當您重新分配該屬性時,它將釋放以前的彈出窗口。不要忘記在呈現視圖控制器的dealloc方法(以及viewDidUnload)中釋放屬性。

這種方法不會泄漏,你不需要處理代表。但是,您可能會將UIPopoverController對象保留更長的時間。您需要確定這是否是您應用的關注點。

2

嘗試自動釋放彈出窗口: [historyPop autorelease]presentPopoverFromRect不保留popover,所以autorelease在這裏不起作用。您需要將您的班級設置爲彈出式窗口控制器的代表,並在popoverControllerDidDismissPopover:中釋放彈出窗口。

+0

發生同樣的錯誤 – 2010-12-07 19:36:10

+2

對不起,我的錯誤 - `presentPopoverFromRect`不保留彈出窗口,所以autorelease在這裏不起作用。您需要將您的類設置爲popover控制器的委託,並在`popoverControllerDidDismissPopover:`中釋放彈出窗口。看到這個問題的第二個答案:http://stackoverflow.com/questions/2867709/retain-release-pattern-for-uipopovercontroller-uiactionsheet-and-modal-view-con – bosmacs 2010-12-07 19:39:53