Сохранить / освободить шаблон для контроллеров UIPopoverController, UIActionSheet и модальных представлений? - PullRequest
14 голосов
/ 19 мая 2010

Мне немного неясно, какие схемы владения объектами требуются в следующих случаях.Когда мой UIViewController представляет контроллер всплывающего окна, лист действий или другой контроллер представления как модальный, требуется ли мне висеть на сохраненной ссылке на этот дочерний контроллер, пока он не будет отклонен?

Другими словами, выполните следующие действияСтроки кода эффективно «передают» право собственности или нет?

[aPopoverController presentPopoverFromBarButtonItem:someButtonItem permittedArrowDirections:UIPopoverArrowDirectionAny animated:NO];

[anActionSheet showFromBarButtonItem:someButtonItem animated:NO];

[aViewController presentModalViewController:someOtherViewController animated:YES];

Может кто-нибудь указать мне явную документацию по этому вопросу?

Ответы [ 2 ]

26 голосов
/ 17 ноября 2010

UIPopoverViewController имеет немного другое управление / владение памятью. Представление popover не сохраняет память, поэтому вы не можете передать владение вашим popviewcontroller представляемому объекту.

Чтобы избежать утечки памяти, вы должны принять UIPopoverControllerDelegate и реализовать метод DidDismissPopOver следующим образом:

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController {
    [popoverController release];
}

Таким образом, вы можете безопасно выделить и представить PopOver:

-(void)showSearch:(id)sender {
    SearchViewController *searchVC = [[SearchViewController alloc] init];
    UIPopoverController *popVC = [[UIPopoverController alloc] initWithContentViewController:searchVC];
    popVC.delegate = self;
    [popVC setPopoverContentSize:CGSizeMake(320, 100)];
    [popVC presentPopoverFromRect:CGRectMake(200, 200, 320, 100) inView:self.view permittedArrowDirections:0 animated:YES];
    [searchVC release];
}
1 голос
/ 19 мая 2010

Представление контроллера модального представления сохраняет UIViewController. Это на самом деле не ясно из документов. Однако я проверил это, используя следующий код ...

NSLog(@"BEFORE %d", [self.setupViewController retainCount]);
[self.navigationController presentModalViewController:self.setupViewController animated:YES];
NSLog(@"AFTER %d", [self.setupViewController retainCount]);

self.setupViewController уже сохранен локально, но при его выводе выдается следующее:

2010-05-19 10:07:36.687 LocateMe[27716:207] BEFORE 1
2010-05-19 10:07:36.762 LocateMe[27716:207] AFTER 3

Таким образом, он, вероятно, сохраняется в локальном свойстве modalViewController, а также в иерархии представления. Отказ от этого уравновесит их.

Итак, суть в том, сохраните его, если хотите контролировать его напрямую, но вам это не нужно.

РЕДАКТИРОВАТЬ - Для ясности, правильный шаблон *1011* всегда должен сохранять объект, если вы устанавливаете себя в качестве его делегата. Это потому, что для безопасности вы должны установить делегата на ноль в вашем узле. Тем не менее, на практике модальный контроллер всегда будет отменен до того, как вы освободите его, так что это не проблема. Вы заметите, что Apple также нарушает это правило в [UIView setAnimationDelegate:], которое фактически сохраняет установленный вами делегат.

...