Подтвердить что ты не робот

Сохранять/освобождать шаблон для UIPopoverController, UIActionSheet и modal view контроллеров?

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

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

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

[anActionSheet showFromBarButtonItem:someButtonItem animated:NO];

[aViewController presentModalViewController:someOtherViewController animated:YES];

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

4b9b3361

Ответ 1

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];
}

Ответ 2

Представление контроллера модального представления сохраняет 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, а также в иерархии представлений. Увольнение будет сбалансировано.

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

EDIT. Чтобы быть ясным, шаблон правильный должен всегда сохранять объект, если вы установите себя как его делегат. Это потому, что вы должны настроить делегата на нуль в своем dealloc для обеспечения безопасности. Практически, однако, модальный контроллер всегда будет уволен, прежде чем вы освободите его, так что это не проблема. Вы заметите, что Apple также нарушает это правило в [UIView setAnimationDelegate:], который фактически сохраняет заданный вами делегат.