过去几天我一直在努力解决这个问题,我找不到任何解决办法,所以我向你征求意见。
我有两个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
我尝试通过在两个视图控制器的发布方法中设置断点来调试代码,但这些方法经常被调用,很难说这可能是导致此问题的原因。
有什么想法吗?
答案 0 :(得分:4)
首先,您获得的错误并未表明-release正被发送到视图控制器,因此视图控制器中的断点将无济于事。过度释放发生在CALayer上,这可能是模态动画的一部分。
首先,我们从一些关于委托的基础知识开始。我觉得这不是很好的事情,但你应该始终从简单的基础开始。您的SettingsUIViewController委托属性应该是assign,而不是retain,因此您可以避免retain循环。这可能已经是正确的了,但是当它不存在时,你可以结束对象存在的时间超过你期望的情况(因此可以在目标消失后发送消息)。同样,可能不是问题,但易于检查和易于修复。
接下来,您应该查看崩溃时的堆栈跟踪。谁在致电[CALayer release]
?可能的原因是拥有的视图控制器在动画停止之前被释放。关闭设置控制器时,是否立即关闭NewPost控制器?