如果使用 ARC,则无需担心释放现有视图控制器;编译器会为你做这件事。如果您没有使用 ARC,但您使用的是综合属性,那么编译器仍会为您处理内存管理。如果您编写自己的访问器方法并且不使用 ARC,只需确保您的访问器方法遵守访问器方法的内存管理规则。如果你没有使用你的访问器方法,那么在用新值覆盖之前释放旧的 ivar。
编辑:至于更换视图控制器,您需要仔细区分视图控制器及其视图。
视图控制器不需要重新加载,尽管这很好。但最初加载它的同一个对象也应该是重新加载它的对象。始终考虑对象、责任和关系(对象所有权)。
通常你会做这样的事情:
- (void)resetCurrentViewController {
UIViewController *old = self.currentViewController;
UIView *oldView = old.view
UIView *superview = [oldView superview];
UIViewController *new = [[MyViewController alloc] initWithNibName:nil bundle:nil];
UIView *newView = new.view;
[UIView transitionWithView:superview
duration:0.2
options:UIViewAnimationOptionTransitionFlipFromLeft
animations:^{ [oldView removeFromSuperview]; [containerView addSubview:newView]; }
completion:^{ self.currentViewController = new; }];
}
这是在编辑框中编写的,而不是来自真实代码,使用替代变量名。基础是“self”(无论是什么)“拥有”“currentViewController”,并用新副本替换当前副本,同时将旧视图换成新视图,假设将具有新的价值观。
但正如另一位评论者所说,这似乎有点矫枉过正。您可以交替重置视图控制器中的所有值(在视图控制器中实现 -reset 方法来执行此操作)和视图(包括任何文本字段或其他控件),将视图更新包装在动画中,这样您就可以获得一个不错的褪色。但是有很多不同的方法可以做到这一点。