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