【发布时间】:2011-12-10 22:04:15
【问题描述】:
我找不到任何合乎逻辑的解释,但事实仍然是,在 iOS 5 (xCode 4.2) 中,如果我 presentModalView:* animated:YES,我可以调用dismissModalViewAnimated:* 很好,但如果我调用 presentModalView:*动画:否,然后调用解除方法崩溃。 (如果我使用新的 presentViewController:animated:completion:+dismissViewControllerAnimated:),这同样适用。我现在要尝试解决这个问题(我不希望演示文稿动画化)并向Apple报告一个错误,但我一直在努力解决这个问题。欢迎任何和所有建议。 iOS 5 上没有多少,所以如果可以,请提供帮助。在 iOS 4 或 iOS 5 中不会崩溃的示例代码:
LoginController *loginController = [[LoginController alloc] initWithNibName:@"LoginControllerGG" bundle:nil];
[self presentModalViewController:loginController animated:YES];
[loginController release];
...
[self dismissModalViewControllerAnimated:YES];
这将在 iOS 5 中崩溃,并在解除调用时出现 EXC_BAD_ACCESS:
LoginController *loginController = [[LoginController alloc] initWithNibName:@"LoginControllerGG" bundle:nil];
[self presentModalViewController:loginController animated:NO];
[loginController release];
...
[self dismissModalViewControllerAnimated:YES]; //crashes with EXC_BAD _ACCESS
注意:我在 loginController 中有一个动画,它发生在 viewDidLoad 上。去看看把它拿出来是否会改变任何东西,但我想把它拿出来,因为我需要尽快找到解决方案。
[编辑] 完整代码流程...在 AppDelegate 中,application:didFinishLaunchingWithOptions:
if (!loggedIn) [myViewController showLoginPanel];
在 myViewController 中:
- (void)showLoginPanel {
LoginController *loginController = [[LoginController alloc] initWithNibName:@"LoginControllerGG" bundle:nil];
if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]) {
[self presentViewController:loginController animated:NO completion:nil];
} else {
[self presentModalViewController:loginController animated:NO]; //iOS 4 works fine with or without animation
}
[loginController release];
}
在登录控制器中:
- (IBAction)closeLoginWindow {
[[NSNotificationCenter defaultCenter] postNotificationName:@"CloseLoginWindow" object:nil];
} //doing it this way because calling on the self.parentViewController doesn't work
返回 myViewController:
- (void) viewDidLoad
...
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(closeLoginWindow) name:@"CloseLoginWindow" object:nil];
...
- (void)closeLoginWindow {
if ([self respondsToSelector:@selector(dismissViewControllerAnimated:completion:)]) {
[self dismissViewControllerAnimated:YES completion:nil]; //iOS 5 crashes only if presentation was not animated
} else [self dismissModalViewControllerAnimated:YES]; //deleting the previous condition, iOS 5 still crashes if presentation was not animated
}
【问题讨论】:
-
正如我所怀疑的,从 loginController 的 viewDidLoad 方法中删除动画与问题无关。在这里抓住稻草。
-
这确实很奇怪。你确定你没有在 [loginController release] 以外的任何地方发布 loginController 吗?
-
我会检查以确保,但更改动画标志并保留所有其他代码会导致崩溃。我认为无论动画如何都会出现管理问题,但这目前无法解释,所以我一定会检查。
-
@Manali,还有其他方法可以实例化该类,但在这次崩溃时不存在。我将编辑我的帖子以显示确切的流程。
-
只需放入 NSLog 以检查可能释放视图的内存不足警告,我没有警告,也没有出现日志。
标签: iphone uiviewcontroller ios5 dismiss