UIPopoverController и управление памятью - PullRequest
5 голосов
/ 07 декабря 2010
    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 был доступен на поповер, пока он еще виден, так когда именно мне следует выпускать контроллер поповера?

Ответы [ 2 ]

5 голосов
/ 08 декабря 2010

Как уже упоминалось в нескольких местах, методы, которые представляют всплывающее окно (либо из прямоугольника, либо с помощью кнопки панели инструментов), не сохраняют всплывающее окно.Итак, ваш контроллер представления должен содержать ссылку на него и освобождать его в соответствующее время.

Вы можете сделать это, установив контроллер представления в качестве делегата поповерса, как уже упоминалось.Более простой, хотя и немного менее эффективный, способ памяти заключается в объявлении свойства retain для хранения UIPopoverController.Когда вы создаете поповер, вы назначаете его свойству, которое сохраняет его.Если позднее вы создадите другой поповер, он освободит предыдущий поповер при переназначении свойства.Не забудьте освободить свойство в методе dealloc контроллера представления (а также в viewDidUnload).

Этот подход не протечет, и вам не нужно иметь дело с делегатами.Но вы потенциально можете хранить объект UIPopoverController дольше, чем необходимо.Вам решать, является ли это проблемой для вашего приложения.

2 голосов
/ 07 декабря 2010

Попробуйте выполнить автоматическое освобождение поповера: [historyPop autorelease]. presentPopoverFromRect не сохраняет поповер, поэтому автозапуск здесь не работаетВам нужно настроить свой класс в качестве делегата контроллера popover и выпустить popover в popoverControllerDidDismissPopover:.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...