【问题标题】:Variables get corrupted变量损坏
【发布时间】:2011-08-18 05:55:20
【问题描述】:

我正在使用基于 Apple 的 UIKit 的 Objective-C 开发 iPhone 应用程序。

我在 UIViewController 中创建了一些类实例,发现我的类实例指针随机损坏。由于类实例指针损坏,我总是遇到这样的 EXC_BAD_ACCESS 崩溃: 异常类型:EXC_BAD_ACCESS (SIGSEGV) 异常代码:0xa095633c 处的 KERN_INVALID_ADDRESS 崩溃的线程:0

说明当我的代码试图访问类实例时,已经变成了一个荒谬的地址:0xa095633c,超出了内存空间甚至二进制图像空间。

有没有人建议哪种不正确的编码可能导致类实例损坏?

【问题讨论】:

    标签: objective-c crash exc-bad-access


    【解决方案1】:

    有很多事情会导致这种情况。仅举几例:

    • 访问已删除的对象
    • 不正确的多线程
    • 指针算法中的错误
    • 堆栈损坏
    • 超出数组范围

    学习使用调试器和调试日志来追踪无效指针出现的位置和时间。

    尝试创建一个重现问题的小型测试程序,以便您发布代码示例。

    【讨论】:

    • 对于其中大约一半,您可能必须知道自己做错了什么才能在测试用例中正确重现它。
    • 感谢您的回答。我遇到的问题很随机。我什至无法通过数千次重试来重现它。
    • 此外,我尝试过 NSZombie,但不走运。没有发现任何已释放的对象被访问。我认为这往往是不正确的多线程导致的问题。在多线程内存管理中我应该特别注意什么?
    • @Chuck:虽然这是真的,但通常可以减少现有代码,直到保留一个简单的测试程序。但这确实需要一些基本技能和对问题的洞察力。此类测试程序通常更有助于报告或演示库中的错误。
    • @user268743 实际上,随机行为对于多线程问题很常见。确保您使用同步原语来保护对可以被多个线程同时访问的所有数据和对象的访问。
    【解决方案2】:

    EXC_BAD_ACCESS 通常表示内存管理错误。阅读Memory Management Programming Guide 并确保您遵守有关 alloc/retain/release/etc 的所有规则。

    【讨论】:

    • 我什至没有为该类实例分配任何东西。当我访问它时,类实例应该为零。 (我只是简单的 NSLog 它的指针,希望看到 null 结果。)
    【解决方案3】:

    你在赋值给变量时是否尝试保留对象?

    一个简单的例子:

    variable = [[[UIViewController alloc] init] retain];
    

    另一种解决方案是将实例变量声明为具有“保留”属性的属性:

    @property(nonatomic, retain) UIViewController *variable;
    

    【讨论】:

    • 我什至没有为那个类实例分配任何东西。当我访问它时,类实例应该是 nil 。 (我只是简单的 NSLog 它的指针,希望看到 null 结果。)
    【解决方案4】:

    这种错误最可能的原因是对象被过早地释放并且一些其他内存被写入它的位置。尝试在 Instruments 中打开 Zombies,它会告诉你是否是这种情况。

    【讨论】:

    • 感谢您的回答。事实上,我尝试过 NSZombie,但并不走运。没有发现任何已释放的对象被访问。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 2010-10-05
    • 2014-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多