【问题标题】:Thread 1: EXC_BAD_ACCESS (code=1, address=0xf00000c)线程 1:EXC_BAD_ACCESS(代码=1,地址=0xf00000c)
【发布时间】:2013-10-11 14:08:58
【问题描述】:

我遇到了线程 1 的问题:EXC_BAD_ACCESS (code=1, address=0xf00000c),我不知道如何解决。 当我更改核心日期中的某个对象并保存它并尝试将此控制器弹出到父级时,它出现了。 此错误在带有 retVal 的 main() 中。 这是一些代码

        int retVal;
    @try {
        retVal =  UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
           */\ error is here**
    }
    @catch (NSException *exception) {
        NSLog(@"%@", [exception callStackSymbols]);
        @throw exception;
    }
    return retVal;

重新运行应用程序后,我的所有更改都在核心数据中。更重要的是这个问题只在 iOS 7 上。iOS 6.1 是可以的。

有人知道如何解决吗?

【问题讨论】:

  • 您能在此处附上完整的堆栈跟踪吗?错误不太可能出现在 main() 中,它更有可能出现在您的代码深处。您还可以尝试使用“Zombies”跟踪模板在 Instruments 中运行您的应用程序,这应该可以帮助您追踪导致问题的对象。
  • 承诺你,错误不在main() 中,这正是调试器在其他所有事情都展开后转储你的地方。
  • EXC_BAD_ACCESS 是硬崩溃,无法通过@catch 捕获。
  • 当您尝试在后台线程上做一些 UI 操作时,有时也会出现这种情况。我正在显示来自后台线程的警报。
  • 如果您的问题与CoreDataNSMAnagedContext.save() 方法有关。我建议从 perform 块中保存上下文,以确保 CoreData 所需的所有数据仍然可用

标签: iphone objective-c ios7 xcode5


【解决方案1】:

正如评论所说,此错误可能在您的代码中很深。如果罪魁祸首是僵尸,找到它的最简单方法是在分析器中运行它(最好在最新的 Xcode 中,目前是 Xcode 5,因为它已经过改进)并选择“僵尸”。当它失败时,您可以看到该对象发生的所有事情的历史记录。

另外,设置一个异常断点。您可能会在错误发生时中断,而不是在异常被传递的 main 中。

【讨论】:

  • Profiler 不知道哪个对象是僵尸。有这样的 wmdc 吗?
  • 它应该告诉你当它打破僵尸时通知你。你在使用 Xcode 5 吗?
【解决方案2】:

我用“Zombies”解决了这个问题,问题出在 [UIScrollView(UIScrollViewInternal) _notifyDidScroll]

我加了

- (void)dealloc {

  self.tableView.delegate = nil;

} 

这个问题只出现在 iOS 7 中。

感谢您的帮助!

【讨论】:

  • 太棒了!请务必选择一个答案。
  • 滚动视图与您的表视图委托有什么关系。我很困惑
  • UITableView 是 UIScrollView 的子类,因此 UITableViewDelegate 也继承了 UIScrollViewDelegate 方法(即 notifyDidScroll)。
【解决方案3】:

我发现我的一个 NSString 变量的名称与框架的类变量之一具有相同的名称,从而解决了同样的问题。花了几秒钟来稍微更改名称,问题就消失了。

由于框架中的类变量数量如此之多,很可能偶尔,每个程序员都会巧合地将其类中的某些变量命名为与框架类中某处使用的变量完全相同的变量。 所以大多数情况下不一定是 Xcode 的 bug。

【讨论】:

  • 5年后我遇到了同样的问题:P
【解决方案4】:

我只是通过调试源代码并重新分析我的逻辑来解决这个问题。

以下是一些对我有很大帮助的参考。

EXC_BAD_ACCESS 意味着消息被发送到内存中没有执行它的类实例的点。因此是“不良访问”。

您将在 3 种情况下获得 EXC_BAD_ACCESS:

  • 对象未初始化
  • 一个对象已被释放
  • 其他不太可能发生的事情

这已经是一个很好的起点。开始使用调试器,如果您最近在正在处理的类中添加了新对象,请在第一次使用新添加的对象之前的行处设置断点并检查调试器中的值。

不过,最常见的情况是您将向过度释放的对象发送消息——即从调用堆栈中消失的对象。在这种情况下,您将在控制台中获得的所有内容(实际上是所有内容)都只是 :EXC_BAD_ACCESS

这是因为对象消失了,没有任何信息它是什么类,或者什么源文件或其他任何东西。

请尽量避免为此使用僵尸。

【讨论】:

    【解决方案5】:

    EXC_BAD_ACCESS 表示没有类的实例来执行它。

    有两种或多种可能性:

    1. 对象未初始化
    2. 一个对象已被释放

    请仔细调试应用程序并仔细分析每个对象。这可能会解决您的问题。

    【讨论】:

      【解决方案6】:

      我今天可能面临另一个问题: 我有一个带有非对象条目尝试的可变字典。有一个代码 sn-p 将 BOOL 值添加到字典中。所以难怪我得到这个错误=)。

      【讨论】:

        【解决方案7】:

        就我而言,我使用的是第三方库,但忘记在 Storyboard Identity Inspector 中设置自定义类名称

        【讨论】:

          【解决方案8】:

          我也遇到了同样的问题。

          看了这里,一无所获,所以我开始回溯,直到我想,也许我应该尝试清洁构建文件夹?

          我很高兴它就像 CLEAN BUILD FOLDER 一样简单!!!

          Product-清理构建文件夹(⇧ ⌘ K)

          ?

          【讨论】:

          • 对我来说唯一的解决方案;在我的项目中,问题是当我在本地环境中对我的 cocoapod 进行更改时引发了 EXC_BAD_ACCESS;我认为 Xcode 没有得到更改,但在构建时没有给出错误。因此,干净的构建文件夹会有所帮助。谢谢
          【解决方案9】:

          在我的例子中,它试图在打印语句中使用%s 记录Int32

          【讨论】:

            猜你喜欢
            • 2018-03-13
            • 2019-07-11
            • 2020-02-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多