【问题标题】:EXC_BAD_ACCESS right after touchesBegan在 touchesBegan 之后立即执行 EXC_BAD_ACCESS
【发布时间】:2011-11-21 21:07:08
【问题描述】:

我已经开始了一个非常简单的项目来学习iOS编程,但是我在touchesBegan之后得到了EXC_BAD_ACCESS

您可以在此处从 DropBox 下载项目。

我基本上有一个UIView 子类,它应该在用户触摸的任何地方绘制圆圈。

很简单,但我做不到。

非常感谢任何帮助。 谢谢!

编辑 原来问题是touchesBegan中的这行代码:

    ts = [NSMutableSet setWithSet: [event touchesForView:self]];

我变成了:

    ts = [[NSMutableSet setWithSet: [event touchesForView:self]] retain];

【问题讨论】:

  • 您应该发布一个最小的代码示例和/或崩溃报告来重现您的问题,而不是整个项目:/
  • 对不起,我想,鉴于项目的规模,发布项目会更快。
  • 对你来说更快——但对回答者来说更慢。我认为你很幸运 @debleek63 遇到了麻烦(应该得到更多的支持)。
  • 你说得对,我已经编辑了答案以使其对未来的读者更有用。

标签: iphone ios xcode exc-bad-access touchesbegan


【解决方案1】:

你为什么不使用ARC??? :) 很好!您不保留您的ts 集。请注意,setWithSet: 返回您自动释放的实例。 (红色圆圈看起来很有希望:))

【讨论】:

  • 谢谢!我认为这解决了它。只是一个简单的问题:我是否总是必须保留从非分配/复制方法获得的对象?
  • 如果调用alloc,调用release。如果你调用retain,调用release。如果你调用复制,调用释放。所有其他函数可能会返回自动释放的对象,所以不要调用 release。但是,我肯定会阅读所有非 Apple 提供的 API 的文档,因为我不相信每个人都遵循这一点——这是一个命名约定,而不是编译器检查。
  • 非常感谢。我禁用 ARC 只是为了了解一下 Objective-c 中的内存管理。将来我会确保检查 API 文档。谢谢大家的帮助!
【解决方案2】:

BAD_ACCESS 错误通常与引用不再存在的对象有关(即它们被释放或被自动释放)。在touchesBegantouchesEnded 中检查这些问题:

  1. release 调用的任何不正确放置,当对象仍将被使用时。尝试将它们注释掉,看看错误是否消失。
  2. 使用自动释放的对象而不是保留它们。自动释放对象是使用直接引用类的方法名称创建的对象,例如:[NSString stringWith...][NSArray arrayWith...],而不是使用 allocinit

如需进一步帮助,请尝试为这些方法包含一些代码 sn-ps。

【讨论】:

  • 回答你刚才问的问题,是的,任何不是用allocinit创建的对象都应该保留。
  • 谢谢!我是新来的,很遗憾我不能投票。
【解决方案3】:

要了解 BAD_ACCESS 在 xCode 中使用 Zombie 的原因,请查看链接 http://www.markj.net/iphone-memory-debug-nszombie/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 2015-08-18
    • 2016-07-22
    • 2014-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多