【问题标题】:NSZombieEnabled does not workNSZombieEnabled 不起作用
【发布时间】:2010-01-06 10:26:14
【问题描述】:

当我设置NSZombieEnabled = Yes 时,没有任何内容写入控制台。我怎样才能解决这个问题?或者你能告诉我EXC_BAD_ACCESS 的任何其他工具吗?

【问题讨论】:

    标签: iphone objective-c nszombie


    【解决方案1】:

    你有一个普通的旧崩溃。 EXC_BAD_ACCESS 表示您的应用程序试图访问无效的内存地址。虽然在非 GC 的 Objective-c 应用程序中最典型的原因是在释放后向对象发送消息,这是僵尸模式检测到的,但这种特定的崩溃可能会以任何其他方式发生(如所示)。

    由于您的应用程序正在崩溃,您应该有一个回溯。您需要在此处发布该回溯,以便我们任何人能够进一步帮助您。

    正如 Brad 所说,在启用调试的情况下运行您的应用程序。在 Xcode 中,您会在“运行”菜单下找到“运行/调试”菜单项。使用那个。当您的应用程序崩溃时,您应该会在调试器窗口的左上角看到堆栈跟踪。

    不,真的,它们确实出现在调试器中。一张图片值一千字。
    (来源:friday.com

    【讨论】:

    • 这让我投票给“对新手最无用的回答”。每个像我这样的新手都知道,普通的旧 EXC_BAD_ACCESS 错误不会显示在调试器窗口中,在任何情况下都不会以普通人可以理解或有帮助的方式出现。如果他们这样做了,那么 CocoaDev 或 StackOverflow 上的帖子量将很容易成为它们的一半。 (好吧,我夸大了,四分之三)。
    • EXC_BAD_ACCESS 是一个崩溃,简单明了。调试器捕捉到所说的崩溃并准确显示它发生的位置。一开始为什么会发生这种情况可能不像那张照片那么清楚。
    • 喜欢这个文件名(但这是一个有用的截图 +1)
    • @Rob 我平均每天在 /tmp/ 中创建 2 到 5 个一次性项目,这就是名称的来源。 :)
    • 优秀的答案。此外,到一天结束时,我至少有三个一次性项目,命名为 DeleteMe1-3,以提醒我稍后清除它们......
    【解决方案2】:

    “EXC_BAD_ACCESS”不一定与僵尸实例相关。它可以链接到对未定义引用的访问,例如局部变量。

    NSArray *array;
    [array objectAtIndex:0]; // <- Will throw an error
    

    编辑: NSZombie 标志只会帮助您解决因使用取消分配的实例而触发的“EXC_BAD_ACCESS”。

    为了解决错误,您必须使用崩溃回溯来查明错误的位置。然后,返回到您的代码并检查每个分配和分配。

    【讨论】:

      【解决方案3】:

      还要确保在使用它们之前将所有指针初始化为 nil!

      如果您使用指针而不将其初始化为 nil 或任何其他对象,您可能最终会访问不属于您的内存。

      例如,下面的代码也会给出一个 EXC_BAD_ACCESS,它不能使用由最后一行引起的 NSZombieEnabled 标志进行跟踪。

      RecordingLocation* closest;
      
      //find the closest recording location
      for (...)
      {
          //try to find the closest object...
          //suppose we don't find anything so closest is never set.
      }
      
      if (closest!=nil)
          NSLog(@"Closest: %f,%f",closest.x,closest.y);
      

      【讨论】:

        【解决方案4】:

        我不明白这个问题的答案如何真正回答了这个问题..

        我也在问自己同样的事情。使用 xcode4 我已经启用 NSZobmieEnabled = YES 在我访问已释放的对象时停止,而不是使用 EXC_BAD_ACCESS 崩溃 - 这非常有帮助。

        手头的问题是:

        “当我设置 NSZombieEnabled = Yes 时,控制台没有写入任何内容。我该如何解决这个问题...”。

        简单直接。

        我遇到了同样的问题。 xcode 与调试器一起停止,但控制台不产生任何消息。我会期待一些类似的东西:

        “发送到已释放实例的消息...”。

        【讨论】:

          【解决方案5】:

          你是search Stack Overflow for EXC_BAD_ACCESS吗,你会发现很多人和你有同样的问题。在大多数情况下,您都会遇到内存问题。如果您遵循herehere 描述的协议,并且您没有在控制台上看到任何有关向已发布对象发送消息的报告,则可能有所不同。

          您是否尝试过在调试器中启动应用程序(运行 | 调试 - 断点打开)?一旦你点击 EXC_BAD_ACCESS,调试器就会停止。如果您查看调试器 (Run | Debugger) 中显示的回溯,它可能会显示错误发生的位置。

          【讨论】:

            【解决方案6】:

            由于我刚刚在 NSZombieEnabled 不起作用的情况下花了 20 分钟快乐地盯着这个,我想我会添加这将导致 EXC_BAD_ACCESS

            NSArray *arr = [NSArray arrayWithObjects:@"@dog","@cat",nil];
            

            注意第二个参数中缺少的“@”。我没有:-)

            【讨论】:

              【解决方案7】:

              我对 EXC_BAD_ACCESS 有不同的体验,所以我想分享一下。

              如问题中所述,即使选中了 NSZombieEnabled,也没有向控制台写入任何内容。在模拟器中挣扎了几个小时后,我决定将它安装到设备上。我从设备调试中得到的错误消息更有帮助。

              最后,我注意到我收到了 EXC_BAD_ACCESS 错误和奇怪的行为,因为我在前一天重命名了几个 xib 文件。我为 MainWindow.xib 文件选择了“视图控制器”对象并更正了 NIB 名称 属性。然后,一切顺利。

              【讨论】:

                【解决方案8】:

                我认为不是每个 EXC_BAD_ACCESS 都被 NSZombie Enabling 找到..
                因为有些情况我在使用zombie时也没有得到结果..
                我认为只有与使用释放对象相关的EXC_BAD_ACCESS才能通过启用zombie来查看。

                我在使用僵尸时注意到的另一个问题是:有时它也会导致调试崩溃。我抓到的一个案例崩溃了,显示:
                *** -[MagazineWebview respondsToSelector:]: message sent to deallocated instance 0x58ce2a0
                它仅在启用 NSZombie 时发生。

                我正在做的是,On
                - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
                我释放当前的“MagazineWebview”对象并将给定的[请求 URL] 加载到另一个“MagazineWebview”对象中。为了实现我的一些功能......

                谢谢

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2011-02-28
                  • 1970-01-01
                  • 2011-06-09
                  • 2011-05-09
                  • 1970-01-01
                  • 2023-03-14
                  • 1970-01-01
                  • 2011-03-19
                  相关资源
                  最近更新 更多