PresentModalViewController: animated: сохранить модальный контроллер?

Это влияет на то, как я взаимодействую с моими модальными контроллерами. Когда я только начинал разработку iOS, Я предположил, что UIViewController не сохранил модально представленное представление. Ну, на самом деле у меня не было причин предполагать, что действительно сохранил их. Это оставило меня с довольно неудобными попытками выпустить их, когда я знал, что они закончат анимацию увольнения:

_myViewController = [[UIViewController alloc] init];
[self. present modalViewController:_myViewController animated:YES];
/* 
Some stuff, then in a different method all together,
probably as the result of a delegate callback or something...
*/
[self dismissModalViewControllerAnimiated:YES];
[_myViewController performSelector:@selector(release) withObject:nil afterDelay:0.5f];

Затем я увидел свойство modalViewController UIViewController и подумал: «Человек , Я надеюсь, что он сохранит это свойство при представлении контроллера модального представления ". Конечно же, я зарегистрировал счетчик удержания для нескольких из этих попыток и заметил общее увеличение сразу после вызова presentModalViewController: animated: (я знаю, что счетчик удержания - не идеальный показатель). Итак, где-то по ходу дела Я начал использовать гораздо более приятный шаблон, в котором я предполагаю, что любой объект контроллера, который я представляю модально, сохраняется представляющим контроллером. Это позволяет мне написать стандартный текущий код:

UIViewController* myViewController = [[UIViewController alloc] init];
[self presentModalViewController:myViewController animated:YES];
[myViewController release]; // <- Fire and forget!

Теперь, конечно, нет неудобств: не нужно ждать завершения анимации или даже сохранять ссылку на представленный контроллер, если он мне не нужен. Я могу слепо отклонить это позже и не беспокоиться о протечке. Мне это нравится.

Я зарегистрировал множество деаллоков в моих модально представленных контроллерах, и они всегда вызываются именно тогда, когда я хочу, что дает мне уверенность в своем подходе: UIViewController presentModalViewController: animated: сохраняет представленный контроллер как свойство modalViewController .

Но, и это суть вопроса, Я понял, что не могу подтвердить это, поскольку задокументировал поведение. И если это не задокументировано, я не буду чувствовать себя так же в безопасности, как я, потому что Apple не обещает долговечности недокументированного поведения. Свойство modalViewController является общедоступным только для чтения , поэтому я могу только предполагать, что оно останется за кадром, а документация по presentModalViewController: animated: говорит только:

Устанавливает свойство modalViewController для указанного контроллера представления.

«Наборы» могут быть assign или сохранить . Ничто из того, что я читаю, открыто не подтверждает и не опровергает мою позицию. Поскольку я часто делаю это предположение, Мне бы очень понравилось, если бы кто-нибудь мог указать на факт, который я пропустил где-то в недрах документации, чтобы успокоить меня по поводу законности этой практики.

РЕДАКТИРОВАТЬ: В суете дня Сегодняшняя жизнь в iOS SDK, я оказался в шапке для UIViewController и начал читать некоторые из них. Я собрал некоторую полезную информацию, которая напомнила мне об этом вопросе, и я решил опубликовать ее, на случай, если какой-нибудь будущий пользователь наткнется на этот вопрос и захочет как можно больше информации, чтобы удовлетворить свою паранойю по поводу очень стандартной практики. Небольшой кусочек из блока @interface ivar в UIViewController.h:

UIViewController *_childModalViewController;

В отличие от этих других объявлений:

UIViewController *_parentViewController; // Nonretained
NSHashTable      *_childViewControllers; // Nonretained

Кажется, в комментариях явно указано, что не сохраняется. Из-за отсутствия комментария к объявлению ivar контроллера модального представления может показаться, что остается .

11
задан Matt Wilding 4 February 2011 в 20:24
поделиться