0

我正在尝试以模态方式呈现视图控制器:

- (IBAction)addReference {

    ReferenceAddViewController *referenceAddViewController = [[ReferenceAddViewController alloc] initWithNibName:@"ReferenceAddViewController" bundle:nil];
    [referenceAddViewController setDelegate:self];

    [self presentModalViewController:referenceAddViewController animated:YES];

    [referenceAddViewController release];
}

但是,如果我稍后调用 [referenceAddViewController release],当模式视图被关闭时,我的应用程序会崩溃,并显示“[CALayer release]:发送到已释放实例 0x4b90370 的消息”。

在 Instruments 中进行堆栈跟踪和引用计数历史并没有给出任何结论,只有两个历史步骤。

  • 0:保留计数 1 - 在我的代码中通过 presentModalViewController 进行 Malloc。
  • 1:保留计数 -1 - 除了 main.m 之外,我的代码中没有任何内容

引用计数如何从 1 跳到 -1 非常有趣?Instruments 会记录每个引用计数的变化吗?

我将如何进一步调试此问题?

4

2 回答 2

1

模态视图控制器关闭后无需释放视图控制器。presentModalViewController:animated:递增retainCount1,dismissModalViewControllerAnimated:递减 1。

因此,当您分配它(+1),呈现它(+1)并释放它(-1),然后它被解除(-1)时,retainCount它将为0,对象将被释放,一切都很好。如果您在它被解除后尝试释放它,则该对象已经被解除分配并且它将无法工作。

于 2010-07-15T11:02:13.833 回答
0

谢谢你的回复,我一直以为你在调用alloc的时候,一开始就将引用计数增加到1?

在那种情况下,调用 presentModalViewController:animated: 时引用计数是否会变为 2?

当模态视图被关闭时,它会再次变为1,但永远不会变为0,因为我没有释放?

于 2010-07-16T05:29:27.187 回答