释放模态视图内容控制器会导致:CALayer release - 发送到解除分配的实例的消息

时间:2010-07-14 06:03:04

标签: objective-c ipad calayer exc-bad-access modalviewcontroller

我正试图以模态方式呈现一个viewcontroller:

- (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”。

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

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

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

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

2 个答案:

答案 0 :(得分:1)

在解除模态视图控制器后,无需释放视图控制器。 presentModalViewController:animated:retainCount递增1,dismissModalViewControllerAnimated:递减1。

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

答案 1 :(得分:0)

感谢您的回复,我一直认为当您调用alloc时,您会在开始时将引用计数增加到1?

在这种情况下,当调用presentModalViewController:animated:时,引用计数会变为2吗?

当模态视图被解除时,它会再次变为1,但从不0,因为我没有释放?