【问题标题】:App is crash in super dealloc method应用程序在 super dealloc 方法中崩溃
【发布时间】:2014-03-13 14:48:22
【问题描述】:

我的应用程序在 [super dealloc]; 行和 - (void)dealloc 方法中崩溃,我正在释放所有保留在 .h 类中的对象,崩溃报告是

-[__NSArrayI respondsToSelector:]: message sent to deallocated instance 0x86fb1a0
-[__NSArrayI respondsToSelector:]: message sent to deallocated instance 0x86fb1a0
-[__NSArrayI respondsToSelector:]: message sent to deallocated instance 0x86fb970
-[UIButton release]: message sent to deallocated instance 0x9b914b0

但是当我阻止[super dealloc]; 时发生了什么,此行代码运行良好,但它给了我警告Method possibly missing [super dealloc] call。如果有人知道请帮助我在哪里做错了。提前致谢。

已编辑

 [_gf_Knowledge_ratingStars release];
[_gf_Range_ratingStars release];
[_quality_ratingStars release];
[_atmosphere_ratingStars release];
[_reviewtxt release];
[_whatsGoodHere release];
[_saveButton release];
[_screen_title release];
[_commentImageView release];
[_resturantBGImageView release];
[_textViewPlaceholder release];
[_gFKnowledgeUnselectBtn release];
[_gFRangeUnselectBtn release];
[_gualityUnselectBtn release];
[_atmosphereUnselectBtn release];
[_gFKnowledgeLbl release];
[_gFRangeLbl release];
[_gualityLbl release];
[_atmosphereLbl release];
[_navbarImageView release];
[_btnBack release];
[super dealloc];

【问题讨论】:

  • 你在某处过度发布了一些东西。
  • 你发布的实例也是由super发布的吗?
  • 它的超类是UIViewController,所以我在这个项目中不关心UIViewController,所以我在超类中什么都不做。
  • 提供dealloc方法内的代码。放置一个特殊的断点,您将在某些时候获得错误的访问权限..您可以轻松解决该问题
  • 我花了很多时间在它上面,它确实在 super dealloc 行上崩溃了。

标签: iphone ios xcode crash-reports


【解决方案1】:

我认为您正在使用 arrayWithArray 静态方法将内存分配给 NSArray

通过这种方式,它会被添加到自动释放池中,并且保留计数将为 0。要么保留它,要么手动 alloc 它与 [[NSArray alloc] init]

【讨论】:

  • 在哪里添加自动释放池,因为我在 dealloc 方法中释放所有那些我保留在 .h 类中的对象。
  • 你有没有像我告诉你的那样初始化你的数组
【解决方案2】:

如果您两次释放一个对象,就会发生这种情况。请检查所有版本并删除任何重复。

【讨论】:

    【解决方案3】:

    确保这一行 ([super dealloc];) 是 dealloc 方法中的最后一条语句 我认为您在[super dealloc] 之后为其他类变量编写了release

    【讨论】:

    • 是的,这是 dealloc 方法中的最后一条语句。
    • 看下面我上面的问题编辑。
    【解决方案4】:

    问题是您正在释放作为 NIB 的一部分加载的 UI 对象。

    黄金法则:不要发布任何不是你自己分配的东西。

    【讨论】:

    • 我将 nil 分配给 - (void)viewDidUnload 方法中的所有对象,实际上这是 xcode 4.5 的默认行为,当您从 nib 到 .h 类进行自动出口时。
    • @josh 您需要提供更多代码才能准确回答您的问题。
    • 代码非常简单,我在.h类中保留并在dealloc方法中释放并在viewdidunload方法中分配nil的出口很少,在整个类中我没有创建或分配甚至没有释放任何物体。但值得注意的是我的 Viewdidunload 方法没有被调用,因为我跟踪它来放置断点。
    • @josh 好的,在您提供更多代码后,我已经编辑了我的答案。
    • 当然,你可以随时切换到使用ARC,再也不用担心释放或过度释放...
    【解决方案5】:

    我认为问题是您创建的按钮之一

    UIButton* btn = [UIButton buttonWithType:UIButtonTypeCustom];
    

    然后你在 dealloc 方法中释放。尝试评论所有声明如上的按钮。

    【讨论】:

    • 问题与数组有关,按钮似乎没问题。
    【解决方案6】:

    首先在您的应用程序中启用僵尸

    怎么办??请通过这个。

    How to enable NSZombie in Xcode?

    现在,当您的应用程序崩溃时,您将知道您的应用程序在哪一行崩溃了。检查有问题的对象有什么标识符。 (保留或分配),检查是否在沿线的某个点为它分配了一个自动释放对象,检查您是否使用合成的 setter 和 getter 来分配这些值或将它们直接分配给属性。如果你已经合成了一个属性,你应该总是使用 (.) 点运算符来设置和获取值。

    至于您已连接的插座。请检查他们有什么标识符。 (保留或分配)。

    【讨论】:

      【解决方案7】:

      你已经两次释放任何变量,我认为你已经在 [super dealloc] 之后为其他类变量编写了释放。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-10
        • 2011-11-17
        • 1970-01-01
        • 2012-05-27
        • 1970-01-01
        • 2023-04-07
        • 1970-01-01
        相关资源
        最近更新 更多