gpt4 book ai didi

objective-c - Objective-C 调试

转载 作者:行者123 更新时间:2023-12-04 06:58:49 24 4
gpt4 key购买 nike

我正在按照开始 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中,不是上面的mutableCopy,而是我错误的写成了mutableDeepCopy。结果,我从常规数组创建的可变数组未能成为简单的副本。

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

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

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

最佳答案

第 1 步。使用调试器。

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

第 2 步。使用仪器。

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com