我正在遵循开始 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/