模态视图控制器关闭时应用程序崩溃
Posted
技术标签:
【中文标题】模态视图控制器关闭时应用程序崩溃【英文标题】:App crashes while Modal view controller closes 【发布时间】:2013-08-12 13:12:11 【问题描述】:我想从应用程序的第二个屏幕显示modalViewControlle
r,当我关闭控制器时,它应该导航到第一个屏幕。下面的代码在 iPhone 4、5 和 iPod Touch 中运行良好,但在 iPAD 中却不行。目标是当我关闭modalViewController
时,它不应该返回到第二个屏幕,而是应该显示第一个屏幕。
ShareEmail *shareEmail = [[ShareEmail alloc] initWithNibName:[NSString stringWithFormat:@"%@",xibShareEmail] bundle:nil];
shareEmail.fromWer = @"ownPer";
[self presentModalViewController:shareEmail animated:NO];
[shareEmail release];
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];
在共享电子邮件类中
[self dismissModalViewControllerAnimated:YES];
【问题讨论】:
你不是在shareEmail
还在显示的时候释放它吗?
首先,您正在使用已弃用的方法。您应该使用presentViewController:animated:completion 和dismissViewControllerAnimate:completion。其次,您正在从错误的类中解散模态显示的控制器。显示模态控制器的类有责任解除它;这样代码应该放在您分配和呈现 ShareEmail 视图控制器的类中,而不是在 ShareEmail 视图控制器本身中。可能无法修复崩溃,但请按照以下步骤开始,以消除最明显的问题来源。
发布应该没问题,作为一般规则,您不负责保留传递给此类方法的对象。但是,UIViewController 文档在这一点上并不完全清楚,因此使用自动释放将是最安全的。不过,使用 ARC 将是解决发布困境的最佳解决方案!
谢谢@petemorris。我想不通。这在 iPhone 中运行良好。但我有这个问题发生在 iPad 上。还是有什么替代方法?
发生这种情况时控制台有输出吗?
【参考方案1】:
您需要保留您的 shareEmail 视图控制器 - 制作一个合成的保留属性
YourClass.h:
@property (nonatomic, retain) ShareEmail *shareEmailViewController;
YourClass.m:
@synthesize shareEmailViewController;
然后通过以下方式显示您的模态视图控制器:
ShareEmail *shareEmail = [[ShareEmail alloc] initWithNibName:[NSString stringWithFormat:@"%@",xibShareEmail] bundle:nil];
self.shareEmailViewController = shareEmail;
[self presentModalViewController:shareEmail animated:NO];
[shareEmail release];
保留的属性将防止视图控制器在使用时被释放。然后,当您稍后将其关闭时,您可以这样做:
[self.shareEmailViewController dismissModalViewControllerAnimated:YES];
self.shareEmailViewController = nil;
这将在你完成后释放保留的属性并释放内存。
【讨论】:
【参考方案2】:有趣的事情正在发生。您正在展示来自self
的视图控制器,然后您让navigationController
执行其向后导航。此时,我之前所说的self
消失了。
从您的presentViewController
方法中删除popViewController
方法。
此外,您还需要使用^completion
处理程序方法。这就是你应该放置导航控制器pop
代码的地方。
-(void)present
ShareEmail *email = [[ShareEmail...
//You'll need to get a weak reference to `self` in `email`
email.modalDelegate = self; //you need to make a property in ShareEmail
[self presentViewController:email animated:YES completion:nil];
[email release];
-(void)dismiss
[self dismissViewControllerAnimated:YES completion:nil];
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];
//in ShareEmail.m
[modalDelegate dismiss];
【讨论】:
如果您的代码中有-release
,则说明您没有使用 arc。你应该迁移到 arc,让很多事情变得更容易
如果我迁移到 arc 那么它将不支持 ios 5 或更低版本。如何使用 arc 调整所有 ios 版本。有什么想法吗?
iOS4 支持 ARC,但不是像 以上是关于模态视图控制器关闭时应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章
sigsegv segv_accerr 在 ios7 中崩溃 mkmapview