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

-(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];

}

它崩溃没有堆栈跟踪的应用程序..请问这是怎么回事。

最佳答案

header 中的testYourInfoViewC是否定义为保留的@property?如果是这样,您应该始终使用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];
}

当您创建保留的@property@synthesize时,将创建一个 setter ,用于处理与保留新对象和释放旧对象有关的内存管理,但是通过将test分配给testYourInfoViewC,您将绕过该合成 setter 。

让我们在这里逐步完成。您已经使用test创建了alloc/init,因此将其keepCount设置为1。接下来,您已将testYourInfoViewC分配给test。保留计数没有变化,现在testYourInfoViewC只是指向与test相同的对象,而不是自己保留副本。

现在,当您在release上调用test时,保留计数将返回0,并且对象将被释放。您的TestYourInfoViewController实例已完全消失,现在testYourInfoViewC随风飘扬。尝试关闭它时,parentViewController将尝试向幕后的对象发送一些消息,例如-viewWillDisappear:-viewDidDisappear:等。

编辑:这是我在项目中处理这种情况的方式。我重写属性的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;
}

设置获取程序以提供惰性实例化之后,您的-art:方法将如下所示...
- (IBAction)art:(id)sender
{
    [self.navigationController presentModalViewController:self.testYourInfoViewC animated:YES];
}

10-06 14:34