Прежде всего, это не в соответствии с руководствами по стилю, и не очень хорошая идея делать релиз viewController внутри метода, подобного этому.Это быстро доставит вам неприятности.Если вызывающий этого метода отвечает за viewController (он сделал сохранение), то он должен также освободить его.Вероятно, это является причиной того, что первый метод не работает из самого viewcontroller.
Во втором методе вы не передаете viewController в качестве параметра, что означает, что его необходимо определить в контексте.
Если вы не выпускаете viewController в этом методе, вам также не нужно устанавливать его переменную равной nil, и вы можете просто передать его как обычный параметр:
-(void)closeView:(UIViewController *)viewController
{
[UIView transitionWithView:self.view
duration:UINavigationControllerHideShowBarDuration
options:UIViewAnimationOptionTransitionCrossDissolve
animations:^
{
[[viewController view] removeFromSuperview];
}
completion:nil];
}
youзатем сделал бы это на сайте вызова:
[self closeView:childViewController];
[childViewController release]; childViewController = nil;
Безопасным образом освободить дочерний объект до завершения анимации, поскольку блок анимации неявно сохраняет все объекты, на которые есть ссылки из блока, включая viewControllerпараметр.Следовательно, дочерний коллектор не вызывается до тех пор, пока блок анимации не освободит его.Это не работает в вашем первом примере кода, потому что вы передаете указатель на переменную.То есть блок анимации не знает, что ему нужно сохранить дочерний элемент.
Кстати, я не уверен, почему вы хотите установить альфа, в приведенном выше примере я показываю, что вы также можете удалить представление ужев блоке анимации.Подробнее об этом см. В справочнике классов UIView .