【问题标题】:Why is this code crashing?为什么这段代码会崩溃?
【发布时间】:2011-03-13 20:28:46
【问题描述】:

我正在加载一个XML file,其中包含大约 600 个小数据集,大约 10,000 行。数据被用作地图上的注释点。我正在使用 TouchXML 库来处理 XML。这是我的代码:

NSData *XMLData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://skidmoreapps.com/darksky/fetch_info.php"]];
CXMLDocument *doc = [[[CXMLDocument alloc] initWithData:XMLData options:0 error:nil] autorelease];
NSArray *nodes = [doc nodesForXPath:@"//site" error:nil];

for (CXMLElement *node in nodes)
{
    ObservationSite *site = [ObservationSite mapAnnotation];
    [site setCoordinate:CLLocationCoordinate2DMake([[[[node elementsForName:@"lat"] objectAtIndex:0] stringValue] floatValue], [[[[node elementsForName:@"lng"] objectAtIndex:0] stringValue] floatValue])];
    [site setTitle:[[[node elementsForName:@"name"] objectAtIndex:0] stringValue]];
    [site setAddress:[[[node elementsForName:@"address"] objectAtIndex:0] stringValue]];
    [site setUrl:[[[node elementsForName:@"name_l"] objectAtIndex:0] stringValue]];
    [site setAffiliation:[[[node elementsForName:@"affil"] objectAtIndex:0] stringValue]];
    [site setAffiliationUrl:[[[node elementsForName:@"affil_l"] objectAtIndex:0] stringValue]];
    [site setOwner:[[[node elementsForName:@"owner"] objectAtIndex:0] stringValue]];
    [site setFee:[[[node elementsForName:@"fee"] objectAtIndex:0] stringValue]];
    [site setAccess:[[[node elementsForName:@"access"] objectAtIndex:0] stringValue]];
    [site setSky:[[[node elementsForName:@"sky"] objectAtIndex:0] stringValue]];
    [site setWeatherUrl:[[[node elementsForName:@"wx_l"] objectAtIndex:0] stringValue]];
    [site setPads:[[[node elementsForName:@"pads"] objectAtIndex:0] stringValue]];
    [site setParking:[[[node elementsForName:@"parking"] objectAtIndex:0] stringValue]];
    [site setRestrooms:[[[node elementsForName:@"b_rooms"] objectAtIndex:0] stringValue]];
    [site setSleep:[[[node elementsForName:@"sleep"] objectAtIndex:0] stringValue]];
    [site setNotes:[[[node elementsForName:@"notes"] objectAtIndex:0] stringValue]];

    [map addAnnotation:site];
}

XML 文件下载后,它会因以下错误而崩溃:

【问题讨论】:

  • 实际抛出的异常是什么?让它完全崩溃超过断点。它应该说一些object does respond to selector或一些东西。
  • 这一行看起来像是上一个迭代节点的实现遗留下来的:CXMLElement *node = [nodes objectAtIndex:i];
  • Squeegy,我没有设置任何断点,所以我猜 TouchXML 包含断点?我该如何摆脱它们?
  • 在您进入枚举循环之前,您的 NSMutableString 有可能被自动释放。尝试自动释放返回的值,即return [theStringValue autorelease]

标签: iphone objective-c xml touchxml


【解决方案1】:

从屏幕截图中我可以看到有一个mutateError 正在发生。如果您修改要枚举的内容,这可能会在快速枚举期间发生。在运行快速枚举的同时,是否有任何事情会修改[self children] 集合?例如,是否有多个线程在做某事?

如果您继续调试器并允许完全抛出异常,您会在控制台上看到什么?

顺便说一句,您的 .php 脚本似乎返回了一个无效的 XML 文档——就我的浏览器而言,某些字符不是有效的 UTF8。也许不是问题,但值得修复和排除。

【讨论】:

  • 不,只有一个线程。从 XML 文件中提取的值不会被修改,除了上面显示的 stringValue 调用。
猜你喜欢
  • 2018-10-28
  • 1970-01-01
  • 2014-07-28
  • 2014-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多