gpt4 book ai didi

iphone - 应用程序在关闭presentModalViewController后崩溃

转载 作者:行者123 更新时间:2023-12-02 10:30:00 25 4
gpt4 key购买 nike

我在使用以下按钮转到另一个 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];

}

它使应用程序崩溃,没有堆栈跟踪。请问这是哪里出了问题。

最佳答案

testYourInfoViewC 是否在 header 中定义为保留的 @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 。

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

现在,当您在 test 上调用 release 时,保留计数将返回 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;
}

设置 getter 以提供延迟实例化后,您的 -art: 方法将如下所示...

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

关于iphone - 应用程序在关闭presentModalViewController后崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6885660/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com