模态视图控制器关闭时应用程序崩溃

Posted

技术标签:

【中文标题】模态视图控制器关闭时应用程序崩溃【英文标题】:App crashes while Modal view controller closes 【发布时间】:2013-08-12 13:12:11 【问题描述】:

我想从应用程序的第二个屏幕显示modalViewController,当我关闭控制器时,它应该导航到第一个屏幕。下面的代码在 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,但不是像 这样的所有约定。无论如何,我认为许多应用程序不再支持 iOS4。所有“当前”设备现在都支持 iOS6,很快就会支持 iOS7。我相信唯一的对手是 iPad 1

以上是关于模态视图控制器关闭时应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

关闭模态视图控制器后自动释放崩溃

sigsegv segv_accerr 在 ios7 中崩溃 mkmapview

视图控制器以模态方式呈现/关闭时的通知?

为啥一个简单的模态视图控制器在呈现和关闭时会滞后?

连续的模态视图控制器在dismissModalViewControllerAnimated 上使应用程序崩溃

关闭模态视图控制器会导致音乐停止