Это влияет на то, как я взаимодействую с моими модальными контроллерами.Когда я только начинал разработку для 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!
Теперь, конечно, неловкости нет: не нужно ждать окончания анимации или даже сохранять ссылку на представленный контроллер, если я неэто не нужноЯ могу слепо отклонить это позже и не беспокоиться о утечке.Мне это нравится.
Я зарегистрировал множество dealloc в моих модально представленных контроллерах, и они всегда вызывались именно тогда, когда я хочу, что заставляет меня чувствовать себя уверенно в моем подходе: UIViewController
s presentModalViewController:animated:
сохраняетпредставленный контроллер как свойство modalViewController
.
Но, и это суть этого вопроса, я понял, что не могу подтвердить это как задокументировано поведение.И если это не задокументировано, я не должен чувствовать себя в такой же безопасности, как и я, потому что Apple не дает никаких обещаний относительно долговечности недокументированного поведения.Свойство modalViewController
является общедоступным readonly
, поэтому я могу только предположить сохранение за кулисами, а в документации по presentModalViewController:animated:
сказано только:
Устанавливает свойство modalViewController для указанного контроллера представления.
«Наборы» могут быть assign
или retain
.Ничто из того, что я читаю, не подтверждает и не отрицает мою позицию.Поскольку я часто делаю такое предположение, мне бы очень понравилось, если бы кто-то мог указать на тот факт, что я пропустил где-то в недрах документации, чтобы успокоить свой разум относительно легитимности этой практики.
РЕДАКТИРОВАТЬ: В приливе и отливе из повседневной жизни в iOS SDK, я оказался в заголовке для UIViewController и начал читать некоторые из них.Я собрал некоторую полезную информацию, которая напомнила мне об этом вопросе, и я решил опубликовать ее, если какой-то будущий пользователь наткнется на этот вопрос и захочет как можно больше информации, чтобы удовлетворить свою паранойю очень стандартной практики.Небольшой кусочек просто из блока @interface ivar в UIViewController.h:
UIViewController *_childModalViewController;
В отличие от этих других объявлений:
UIViewController *_parentViewController; // Nonretained
NSHashTable *_childViewControllers; // Nonretained
В комментариях явно указывается, что не сохраняется.Из-за отсутствия комментариев к объявлению ivar контроллера модального представления может показаться, что является сохраненным.