objective-c - Objective C 调试

标签 objective-c debugging

我正在遵循开始 iPhone 3 开发中的示例。在第 8 章中,我在代码中犯了一个错误。

    - (NSMutableDictionary *)mutableDeepCopy
{
 NSMutableDictionary * ret = [[NSMutableDictionary alloc] initWithCapacity:[self count]];

 NSArray * keys = [self allKeys];
 for (id key in keys) {
  id oneValue = [self valueForKey:key];
  id oneCopy = nil;

  if ([oneValue respondsToSelector:@selector(mutableDeepCopy)])
   oneCopy = [oneValue mutableDeepCopy];
  else if ([oneValue respondsToSelector:@selector(mutableCopy)])
   oneCopy = [oneValue mutableCopy];
  if (oneCopy == nil)
   oneCopy = [oneValue copy];
  [ret setValue:oneCopy forKey: key];
 }
 return ret;
}

在第二个responseToSelector中,我错误地将其写为mutableDeepCopy,而不是上面的mutableCopy。结果,我从常规数组创建的可变数组未能成为简单的副本。

结果控制台将打印如下错误消息:

2010-02-04 19:58:28.381 Sections[1806:20b] * WebKit 丢弃了 webView 中未捕获的异常:shouldInsertText:replacingDOMRange:givenAction: delegate: * -[NSCFArray removeObjectAtIndex: ]:发送到不可变对象(immutable对象)的变异方法

现在我的问题是,如果我编写自己的代码而不是从书中复制代码,这对我来说真的很难调试。我如何知道这个“发送到不可变对象(immutable对象)的变异方法”发生在哪一行?

最佳答案

第 1 步。使用调试器。

运行 -> 调试器或 Shift-Command-Y。当您的程序遇到类似上面的错误时,您可以看到代码中的哪个位置停止了。您可以看到Apple's instructions使用调试器了解详细信息,但基本的东西很容易弄清楚。最重要的部分是调试器左上象限的线程列表面板。它允许您在堆栈中上下移动以查看代码中发生错误的位置。通常,您将能够使用它来确定哪一个对象被声明为不可变和不可变。

第 2 步。使用仪器。

Instruments功能强大,可以让你做一些非常漂亮的事情。在这种情况下,一旦您找到了意外不可变对象(immutable对象)的内存地址,您就可以使用 Instruments 来查看该对象的历史记录,并希望将其追溯到其起源。要使用仪器来跟踪对象,您需要使用对象分配来运行仪器(运行 -> 使用性能工具运行 -> 对象分配)。如果您知道出错对象的地址,则可以在“仪器”右下角的搜索框中搜索它。打开扩展详细信息 View (Command-E) 以查看该对象所在的位置。

关于objective-c - Objective C 调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2199422/

相关文章:

objective-c - 如何从 int* 转换为 NSNumber*

ios - 根据服务器的响应动态创建表单

objective-c - 从字符串中删除字符和后面的所有内容

iOS:自定义UITableViewCell的实现需要调用super

android-studio - 更新到 Android Studio 4.2.1 后如何修复错误 "Could not connect to remote process. Aborting debug session."

.net - 如何在登台服务器中调试 .net dll 程序集

java - 调试外部启动的 jar 文件

ios - 尝试在 iOS 中将数据保存在 txt 文件中时出现 UI 阻塞

java - 如何确定原生Android组件中React-Native中的DevMode?

windows - 在 windbg 中调试 "release-mode"二进制文件/转储