Iphone 应用程序在关闭presentModalViewController后崩溃

Iphone 应用程序在关闭presentModalViewController后崩溃,iphone,ios4,crash,Iphone,Ios4,Crash,使用以下按钮转到另一个控制器时出现问题 -(IBAction)art:(id)sender{ TestYourInfoViewController *test = [[TestYourInfoViewController alloc] initWithNibName:@"TestYourInfoViewController" bundle:[NSBundle mainBundle]]; test.questionType = @"ar

使用以下按钮转到另一个控制器时出现问题

-(IBAction)art:(id)sender{

TestYourInfoViewController *test = [[TestYourInfoViewController alloc]
                              initWithNibName:@"TestYourInfoViewController" bundle:[NSBundle mainBundle]];
test.questionType = @"art";
testYourInfoViewC = test;
[testYourInfoViewC setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal];
[self.navigationController presentModalViewController:testYourInfoViewC animated:YES ];
[test release];
}

当我回到下面的

-(IBAction)back:(id)sender{
   [[self parentViewController] dismissModalViewControllerAnimated:YES];    
}


它会在没有stacktrace的情况下使应用程序崩溃。。请问这有什么问题。

标题中是否将
testYourInfoViewC
定义为保留的
@属性?如果是这样,您应该始终使用
self
和点符号来引用它

- (IBAction)art:(id)sender
{
    TestYourInfoViewController *test = [[TestYourInfoViewController alloc]
                              initWithNibName:@"TestYourInfoViewController" bundle:[NSBundle mainBundle]];
    test.questionType = @"art";
    self.testYourInfoViewC = test;
    [self.testYourInfoViewC setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal];
    [self.navigationController presentModalViewController:self.testYourInfoViewC animated:YES ];
    [test release];
}
创建保留的
@属性
@合成
时,将创建一个setter,该setter处理保留新对象和释放旧对象所涉及的内存管理,但通过将
test
分配给
testYourInfoViewC
则绕过了该合成setter

让我们从这里开始。您已经使用
alloc/init
创建了
test
,从而将其重新计数设置为1。接下来,您将
testyournofoiwc
分配给
test
。保留计数没有变化,
testYourInfoViewC
现在只是指向与
test
相同的对象,而不是为自己保留一个副本

现在,当您在
test
上调用
release
时,retain count返回到0,并且对象被释放。您的
TestYourInfoViewController
实例已完全消失,
testYourInfoViewC
现在仍在风中飘动。当试图关闭它时,
parentViewController
将尝试在幕后向该对象发送一些消息,如
-viewwilldiscover:
-viewdidecome:

编辑:以下是我在项目中如何处理这种情况。我重写属性的getter并确定是否需要创建它。通过这种方式,我可以在代码中的任何地方调用该属性,我可以确信,如果没有创建该属性,它将被及时分配、初始化和设置

- (TestYourInfoViewController *)testYourInfoViewC
{
    if (!testYourInfoViewC)
    {
        testYourInfoViewC = [[TestYourInfoViewController alloc] init]; // This will work because the .xib and class name are identical. 
        [testYourInfoViewC setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal];
    }

    return testYourInfoViewC;
}
设置getter以提供惰性实例化后,您的
-art:
方法将如下所示

- (IBAction)art:(id)sender
{
    [self.navigationController presentModalViewController:self.testYourInfoViewC animated:YES];
}

现在,在我这样做之后,当我返回时,它工作正常,但如果我再次按下按钮以获取(艺术)页面,它将在@synthetic testyournofoiviewc崩溃。。。也没有stacktrace!!什么是我编辑了我的答案,以显示这个问题的更有效的解决方案。当我说testYourInfoViewC时,还会有另一个奇怪的问题吗;除非我返回并再次进入控制器,否则它不会添加到控制器中。抱歉,我忘了将该行添加回控制器中。如果
questionType
是可以变化的,则应在
-art:
方法中进行设置。如果它从未改变,那么在覆盖的getter中设置该行。是的,我当然注意到:)和我的问题,在我添加它后,它在第二次运行时,我转到控制器,在我更改控制器中的任何内容后,返回并再次返回,控制器似乎没有被释放,就像我离开它一样