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中设置该行。是的,我当然注意到:)和我的问题,在我添加它后,它在第二次运行时,我转到控制器,在我更改控制器中的任何内容后,返回并再次返回,控制器似乎没有被释放,就像我离开它一样