Iphone &引用;[CALayer release]:发送到解除分配实例的消息;解除模态视图控制器时

Iphone &引用;[CALayer release]:发送到解除分配实例的消息;解除模态视图控制器时,iphone,memory-management,Iphone,Memory Management,在过去的几天里,我一直在努力解决这个问题,我找不到任何解决办法,所以我向你寻求建议 我有两个UIViewController:NewPostiviewController和SettingsUIViewController。在第二个字段中,我有一个字段: id<SettingsUIViewControllerDelegate> delegate 按下按钮时,在NewPositiviewController中执行以下代码: SettingsUIViewController *setti

在过去的几天里,我一直在努力解决这个问题,我找不到任何解决办法,所以我向你寻求建议

我有两个UIViewController:NewPostiviewController和SettingsUIViewController。在第二个字段中,我有一个字段:

id<SettingsUIViewControllerDelegate> delegate
按下按钮时,在NewPositiviewController中执行以下代码:

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];
[delegate settingsAreDone:sender];
    [self dismissModalViewControllerAnimated:YES];
当我想关闭SettingsUIViewController时,我调用(SettingsUIViewController中的代码):

和设置如下图所示(NewPostiviewController中的代码):

这一切的结论如下:

[CALayer release]: message sent to deallocated instance 0x5a76840
我试图通过在两个视图控制器的发布方法中设置断点来调试代码,但是这些方法被频繁调用,很难说是什么导致了这个问题


有什么想法吗?

首先,您收到的错误并不表示-release正在被发送到视图控制器,因此视图控制器中的断点没有帮助。过度释放发生在CALayer上,这可能是模态动画的一部分

首先,我们从有关委托的一些基础知识开始。我不认为这是原因,但你应该总是从简单的基础开始。您的SettingsUIViewController委托属性应该是assign,而不是retain,因此您可以避免retain循环。这可能已经是正确的了,但如果不是这样,您可能会遇到这样的情况:对象存在的时间比您预期的要长(因此可以在其目标消失后发送消息)。同样,可能不是问题,但易于检查和修复


接下来,您应该查看崩溃时的堆栈跟踪。谁在呼叫
[CALayer release]
?一个可能的原因是在动画停止之前释放了所属的视图控制器。当您关闭设置控制器时,是否立即关闭NewPost控制器?

谢谢您的评论,很抱歉响应太晚。回答您的建议:yes delegate是一个retain属性。下面是堆栈跟踪的样子:no我不关闭NewPost控制器,这是我的应用程序的主视图控制器。@jakub do u修复此问题。我也有一个类似的问题我很困惑-动画不保留拥有的对象吗?所以释放控制器应该不是问题。我想这会对你有所帮助。
[CALayer release]: message sent to deallocated instance 0x5a76840