【问题标题】:*** -[UIImage retain]: message sent to deallocated instance*** -[UIImage 保留]:发送到已释放实例的消息
【发布时间】:2011-06-06 02:20:48
【问题描述】:

我的应用程序中出现了一个非常奇怪的内存管理问题。我有一个 UISplitViewController appps,其中 RootViewController 是一个 UITabBarApplication。错误:

*** -[UIImage retain]: message sent to deallocated instance 0x555960

当我尝试通过点击标签栏按钮来切换视图时,总是会发生这种情况。我在按钮上有三个标签栏按钮。我的代码中也没有任何对 UIImage 保留的调用。

有人对如何调试有任何提示吗?我不知道如何具体重现这一点,我只知道当我在标签之间切换时有时会发生这种情况。

调试器在以下位置中断:

int main(int argc, char *argv[])
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, @"CVore", nil);
    [pool release];
    return retVal;
}

更新: 我收到了内存警告。 Level=1,然后当我切换标签时,它给了我这个错误。

【问题讨论】:

  • 为什么要发布这个? [头像发布];
  • 它缺少一些代码,实际上这不是问题,因为我删除了所有 TTImageView 并且问题仍然存在
  • 你能把调试器停止执行的那一行贴出来吗?
  • 虽然我认为这不会有太大帮助...但我更新了我上面的帖子..我一直在删除我可以在我的应用程序中找到的尽可能多的 UIImage,但它仍然给了我这个错误..很奇怪
  • 好的。我想帮助你,但很难知道。你有没有像 MyObject *object; 这样声明但没有初始化的对象?而是 MyObject *object=nil; ?可能是您的问题不在 UIImage 中。

标签: iphone objective-c memory-management


【解决方案1】:

您是否尝试过在代码中使用Analyzer?不能保证,但它可能会有所帮助。

【讨论】:

    【解决方案2】:

    听起来你正在释放一个你没有保留的自动释放对象。稍后,当自动释放池耗尽/释放时,会向该(现在无效)对象发送 -release 消息,从而导致异常。

    turn on NSZombieEnabled 是一个好的开始,这样您就可以更好地了解所涉及的对象。然后先看一下该对象是如何创建的。由于您的异常似乎在您收到内存警告时发生,请查看在这种情况下会发生什么。您可能有一个 -viewDidUnload 方法错误地释放了对象。

    【讨论】:

    • NSZombieEnabled 已经开启,当它崩溃时它中断的行并不能真正告诉我
    【解决方案3】:
    Received memory warning. Level=1
    

    通常意味着您的代码正在泄漏内存。从您提供的代码中,无法判断出什么问题。向我们提供更多代码,或者观看 WWDC 2010 Session 311 - Advanced Memory Analysis with Instruments,这将帮助您自行查找错误。

    【讨论】:

    • AFAIK,内存警告只是意味着系统正在尝试释放一些内存用于其他目的。当您有严重泄漏时,它可能确实会发生,但我认为警告不一定表示泄漏。
    • 你是对的,但从第一篇文章来看,我宁愿说这是内存泄漏。无论如何,我已经更新了我的帖子。正如查尔斯巴克利所说“我可能是错的,但我对此表示怀疑”:)
    • 我尝试在仪器中运行程序,但发生此错误时没有发现任何泄漏
    猜你喜欢
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    相关资源
    最近更新 更多