dismissModalViewController导致崩溃

时间:2011-10-16 17:23:40

标签: iphone objective-c cocoa-touch

我一直在努力调试这个问题几个小时,但没有运气。我有一个按钮,按下时只需这样做:

[self.parentViewController dismissModalViewControllerAnimated:NO];

现在我有很多AVAudioPlayers和AVAudioRecorders正在进行中,但我肯定会在退出之前仔细处理所有这些。奇怪的是,按下此按钮并不总是导致应用程序崩溃。只有经过一段时间后,应用程序才会在点击时崩溃。因此,如果我在页面加载后2秒按下按钮,那么我可以毫无问题地解除视图,并返回到其他视图。但是,如果我等了9秒或更长时间,我就会崩溃。

我知道用这些小信息帮助我是不可能的,但是如何开始调试这个问题呢?崩溃时我没有得到任何有用的输出,只有BAD_ACCES,根本没有消息。我怎样才能更深入地了解这一点并找到正在发生的事情?调试器也没有帮助。

编辑:我不确定我是否已经修复了这个问题,因为它是随机的,但是当我第一次创建视图控制器时,我会稍后解雇,我这样做:

CloseDoorViewController *closeVC=[[CloseDoorViewController alloc] init];
[self.view addSubview:closeVC.view];
[self presentModalViewController:closeVC animated:NO];
[closeVC release];

然后,当我在CloseDorView中,并且我点击dismissModalViewController时,我得到了崩溃。但在评论[closeVC release];之后,问题就消失了(我认为)。所以我不应该发布closeVC吗?这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:3)

我怀疑这里发生的是你试图从实际模态视图控制器代码中的按钮单击处理程序中解除模态视图控制器。这是我在显示模态视图控制器时经常做的事情:

在这个例子中,vc1是将呈现vc2的“父”(我使用那个松散的)视图控制器。

(1)。创建协议(“ModalViewControllerDelegate.h”):


//ModalViewControllerDelegate.h
@protocol ModalViewControllerDelegate 
-(void)viewControllerDidFinishShowing:(UIViewController*)controller;
@end

(2)。像这样编辑vc1:


//vc1.h:
#import "ModalViewControllerDelegate.h"
//...
@interface vc1 : UIViewController 
<ModalViewControllerDelegate>
{
//...
}

//vc1.m
#import "vc2.h"
//...
#pragma mark -
#pragma mark ModalViewControllerDelegate Methods
-(void)viewControllerDidFinishShowing:(UIViewController *)controller
{
    if(self.modalViewController == controller)
    {
        [self dismissModalViewControllerAnimated:YES];
    }
}
//...

(3)。像这样编辑vc2:


//vc2.h
#import "ModalViewControllerDelegate.h"
//...
@interface vc2 : UIViewController 
{
  id modalDelegate;
//...
}
//...
@property (nonatomic, assign) id modalDelegate;
- (IBAction)dismissButtonClicked:(id)sender;

//vc2.m
- (void)dealloc
{
//...
    self.delegate = nil;
//...
}
//...
- (IBAction)dismissButtonClicked:(id)sender
{
  if(self.modalDelegate)
   {
       if([self.modalDelegate respondsToSelector:@selector(viewControllerDidFinishShowing:)])
       {
           [self.modalDelegate viewControllerDidFinishShowing:self];
       }
   }
}

(4)。从vc1中提出vc2就像这样:


//vc1.m
//...
vc2 *controller = [[vc2 alloc] initWithNibName:@"vc2" bundle:[NSBundle mainBundle]];
controller.modalDelegate = self;//very important
[self presentModalViewController:controller animated:YES];
[controller release];
//...

说明: vc1创建vc2并将自己设置为vc2的委托......当在vc2的视图中单击dismiss按钮时,它会检查是否存在委托,找到vc1,并且vc1中的相应选择器/方法会触发...这解散了vc2。

我希望有所帮助。

答案 1 :(得分:1)

只需使用

[self dismissModalViewControllerAnimated:NO];

而不是self.parentViewController

如果你没有使用ARC,你确定你保留了你正在解雇的模态视图控制器吗?