2012-05-30 5 views
0

Когда я использую UIPopoverController и дать ему contentViewController, я не могу показаться, чтобы получить contentViewController правильно освобождаться (о чем свидетельствует тот факт, что contentViewController.viewDidUnload никогда не вызывался).contentViewController.viewDidUnload UIPopoverController не вызывался

код для создания и отображения всплывающего окна:

PopupTestViewController *popupTest = [[PopupTestViewController alloc] initWithNibName:@"PopupTestViewController" bundle:nil]; 
popupTest.mainViewController = self; 
self.popoverController = [[UIPopoverController alloc] initWithContentViewController:popupTest]; 
self.popoverController.popoverContentSize = popupTest.view.frame.size; 
self.popoverController.delegate = self; 
[self.popoverController presentPopoverFromRect:button.frame inView:button.superview permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 

Теперь я предполагаю, что contentViewController (в приведенном выше коде, это PopoverTestViewController) должен быть высвобождены, когда UIPopoverController закрыт (будь то щелкнув его или явно отклонив его). Но viewDidUnload никогда не называется. Однако я заметил, что если я определяю метод dealloc для PopoverTestViewController, это называется соответствующим образом.

Так что мой вопрос: почему viewDidUnload никогда не звонит? (И я использую ARC).

+0

Как вы определяете свойство 'popoverController'' @? –

+0

'@property (неатомный, сохранить) UIPopoverController * popoverController;' – caleb

ответ

0

viewDidUnload не гарантируется дозвонились. Он вызывается только тогда, когда приложение получает предупреждение о памяти, а принимающий ViewController загружает view, но выключен. Когда загружается view и количество отсчетов сохраняется до нуля, viewDidUnload не вызывается.

Подробнее см. В documentation. Инструкции о том, когда выпускать какие объекты можно найти в том же document.

0

Это немного отличается от того, что я использовал UIPopoverController. Так как вы вручную alloc 'ed popupTest, вам определенно нужно вручную release. Экземпляр UIPopoverController сохранит popupTest, когда вызывается initWithContentViewController:.

Кроме того, если вы определяете popoverController свойства с retain, то вы получаете двойной сохранить при использовании self.popoverController сеттера, назначая непосредственно из alloc. Общая схема для установки @property является:

@property (nonatomic, retain) Foo* foo; 

... 

Foo* aFoo = [[Foo alloc] init]; 
self.foo = aFoo; 
[aFoo release]; 
+0

Я должен был упомянуть, что я использую ARC, поэтому нет необходимости явно выпускать что-либо. – caleb

Смежные вопросы