“[CALayer release]:在解除模态视图控制器时发送到解除分配实例的消息”

时间:2010-09-11 14:19:12

标签: iphone memory-management

过去几天我一直在努力解决这个问题,我找不到任何解决办法,所以我向你征求意见。

我有两个UIViewControllers:NewPostUIViewController和SettingsUIViewController。在第二个我有一个领域:

id<SettingsUIViewControllerDelegate> delegate

并且第一个实现协议

SettingsUIViewControllerDelegate

按下按钮时,在NewPostUIViewController中执行以下代码:

SettingsUIViewController *settingsUIViewController  = [[SettingsUIViewController alloc] initWithNibName:@"SettingsView" bundle:nil]; 
settingsUIViewController.title = NSLocalizedString(@"Settings", @"Settings view title");
settingsUIViewController.delegate = self; 
[self presentModalViewController:settingsUIViewController animated:YES];
[settingsUIViewController release];

当我想解雇我调用的SettingsUIViewController时(在SettingsUIViewController中的代码):

[delegate settingsAreDone:sender];

和settingsAreDone看起来如下(NewPostUIViewController中的代码):

    [self dismissModalViewControllerAnimated:YES];

这一切都在以下结论:

[CALayer release]: message sent to deallocated instance 0x5a76840

我尝试通过在两个视图控制器的发布方法中设置断点来调试代码,但这些方法经常被调用,很难说这可能是导致此问题的原因。

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

首先,您获得的错误并未表明-release正被发送到视图控制器,因此视图控制器中的断点将无济于事。过度释放发生在CALayer上,这可能是模态动画的一部分。

首先,我们从一些关于委托的基础知识开始。我觉得这不是很好的事情,但你应该始终从简单的基础开始。您的SettingsUIViewController委托属性应该是assign,而不是retain,因此您可以避免retain循环。这可能已经是正确的了,但是当它不存在时,你可以结束对象存在的时间超过你期望的情况(因此可以在目标消失后发送消息)。同样,可能不是问题,但易于检查和易于修复。

接下来,您应该查看崩溃时的堆栈跟踪。谁在致电[CALayer release]?可能的原因是拥有的视图控制器在动画停止之前被释放。关闭设置控制器时,是否立即关闭NewPost控制器?