gpt4 book ai didi

objective-c - NSArray 中的 EXC_BAD_ACCESS 在崩溃前创建了 3 行

转载 作者:行者123 更新时间:2023-12-03 16:55:59 25 4
gpt4 key购买 nike

我刚刚开始开发我的第一个“真正的” cocoa 应用程序。请注意,这是 Mac,而不是 iPhone。

当我的漫画异步下载完成时,会调用此函数,目的是从中解析漫画的 NSArray 列表。我从nodesForXPath 获取一个NSArray,并保留它以确保它是我的。 (也试过保留两次,呵呵)。不幸的是,尝试检索 NSArray 的计数会导致 EXC_BAD_ACCESS。下面的两条评论标记了崩溃点。

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSLog(@"Download Succeeded! Received %d bytes of data. Beginning Parse.",[mangaListData length]);
NSString* theQuery = [[NSString alloc]initWithString:@"//tr/td[@class=\"ch-subject\"]/text()"];
NSError *XMLError=nil;
NSError *XPathError=nil;
NSString* mangaListHTML;
NSString* fixedMangaListHTML;
mangaListHTML = [[NSString alloc] initWithData:mangaListData encoding:NSUTF8StringEncoding];
fixedMangaListHTML = [mangaListHTML stringByReplacingOccurrencesOfString:@" & " withString:@" & "];
NSXMLDocument* xmlDoc = [[NSXMLDocument alloc] initWithXMLString:fixedMangaListHTML
options:(NSXMLNodePreserveWhitespace|NSXMLNodePreserveCDATA)
error:&XMLError];
if (XMLError) {
NSLog(@"XML Parse error: %@", XMLError);
return;
};
[fixedMangaListHTML release];
[mangaListHTML release];
NSArray* results = [[xmlDoc nodesForXPath:theQuery error:&XPathError] retain];
if (XMLError) {
NSLog(@"Parse error: %@", XPathError);
return;
};
NSLog(@"Parsing complete. Manga List = ");
//CRASH HAPPENS HERE
NSLog(@"Size of array: %@", [results count]);
//CRASH HAPPENS ABOVE
for(NSXMLNode* title in results){
NSLog(@"%@\n", title.description);
};
[XMLError release];
[XPathError release];
[connection release];
[mangaListData release];

}

这是 gdb 中 where 的输出。 (我还不知道如何使用 gdb,所以我可以运行任何命令来获取更多信息,我们将不胜感激。)

#0  0x00007fff855691d1 in objc_msgSend_vtable5 ()
#1 0x00007fff87e97207 in _NSDescriptionWithLocaleFunc ()
#2 0x00007fff8509ba2d in _CFStringAppendFormatAndArgumentsAux ()
#3 0x00007fff8509aead in _CFStringCreateWithFormatAndArgumentsAux ()
#4 0x00007fff85119f5f in _CFLogvEx ()
#5 0x00007fff87ef937f in NSLogv ()
#6 0x00007fff87ef9317 in NSLog ()
#7 0x0000000100002bca in -[TMMoneManga connectionDidFinishLoading:] (self=0x1001999f0, _cmd=0x7fff8803b5de, connection=0x1001689a0) at /Users/ripdog/Documents/TheMangaMachine/TMMoneManga.m:120
#8 0x00007fff87f16b8c in _NSURLConnectionDidFinishLoading ()
#9 0x00007fff8063f18e in URLConnectionClient::_clientDidFinishLoading ()
#10 0x00007fff806a4502 in URLConnectionClient::ClientConnectionEventQueue::processAllEventsAndConsumePayload ()
#11 0x00007fff8062b8fb in URLConnectionClient::processEvents ()
#12 0x00007fff8062b6d8 in MultiplexerSource::perform ()
#13 0x00007fff850b6f21 in __CFRunLoopDoSources0 ()
#14 0x00007fff850b5119 in __CFRunLoopRun ()
#15 0x00007fff850b48df in CFRunLoopRunSpecific ()
#16 0x00007fff80b83ada in RunCurrentEventLoopInMode ()
#17 0x00007fff80b838df in ReceiveNextEventCommon ()
#18 0x00007fff80b83798 in BlockUntilNextEventMatchingListInMode ()
#19 0x00007fff8845fa2a in _DPSNextEvent ()
#20 0x00007fff8845f379 in -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] ()
#21 0x00007fff8842505b in -[NSApplication run] ()
#22 0x00007fff8841dd7c in NSApplicationMain ()
#23 0x00000001000017cd in main (argc=1, argv=0x7fff5fbff6c0) at /Users/ripdog/Documents/TheMangaMachine/main.m:13

提前非常感谢。

最佳答案

问题出在您的格式字符串上。 %@ 说明符将显示 Objective-C 对象,但 [结果计数] 是一个整数。整数的正确格式说明符是 %d。作为引用,这里是 a complete list of Objective-C string format specifiers.

您的问题表明,当您尝试检索[结果计数]时发生崩溃。但是,如果查看调用堆栈,您的代码是第 7 帧,堆栈上的下一个函数(第 6 帧)是 NSLog。因此,这告诉您问题可能与对 NSLog 的调用有关,而不是 [结果计数]。在控制流进入 NSLog 之前,[结果计数] 已经返回。

使用 gdb 进行调试有多种技术。由于您正在调试崩溃,因此您的重点主要是检查调用堆栈、变量和内存(而不是在执行代码时逐步执行代码)。因此,对于这种调试,这些命令至关重要:

  • up 这会将调试器的“焦点”向上移动调用堆栈的一帧。假设您想检查程序中的变量。您无法在调试器停止的 objc_msgSend_vtable5 中看到它们。因此,请使用 up 7 向上跳七帧,以便您查看代码。
  • 向下 与向上相反。通常,您想要查看导致灾难的原因,因此跳到代码,然后向下、向下、向下是了解灾难如何发生的一种方法。 (当然,这不会让您在时间上前进或后退。)
  • where 显示调用堆栈的一部分。你已经发现了这一点。我唯一的建议是,您通常只关心调用堆栈顶部的内容。您可以使用 where n 打印调用堆栈的前 n 帧。
  • list 显示“聚焦”框架的源代码,并用箭头指示执行点。因此,例如,up 7 后跟 list 应该向您显示 connectionDidFinishLoading 的源,并在 NSLog 调用旁边有一个指示器。如果您只需要查看周围上下文的几行,那么使用 list 通常比在 XCode 中查找代码更方便。
  • print 计算表达式并打印它。例如,您可以执行 print [results count] 来查看 [results count] 的计算结果。当调试器因程序处于错误状态而停止时,print 会表现得很有趣(它确实可以运行代码。)因此,简单的表达式通常效果更好。
  • info 信息可以告诉你很多事情,但 info locals 确实很有值(value)。它向您显示调试器“聚焦”框架范围内的局部变量。

关于objective-c - NSArray 中的 EXC_BAD_ACCESS 在崩溃前创建了 3 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3123329/

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