getNode:withName:肥皂的方法解析一些大的XML Web服务

问题描述:

我使用SudzC作为一个Objective-C的包装我的XML Web服务时被调用超过200万次,如你所知,SudzC使用TouchXML这是被认为是最好和最快的XML解析器之一。当加载我的XML Web服务,解析它并最终将其保存到核心数据时,它会在数据库中产生大约2500条记录,所以它是一种很棒的服务。我注意到一个很奇怪的,是soap.m文件我放在NSLog语句下面的方法:getNode:withName:肥皂的方法解析一些大的XML Web服务

  + (CXMLNode*) getNode: (CXMLNode*) element withName: (NSString*) name { 
      for(CXMLNode* child in [element children]) { 
      if([child respondsToSelector:@selector(name)] && [[child name] isEqual: name]) { 
       return (CXMLNode*)child; 
       } 
      } 

      for(CXMLNode* child in [element children]) { 
      CXMLNode* el = [Soap getNode: (CXMLElement*)child withName: name]; 
      if(el != nil) { return el; } 
       } 
     return nil; 
     } 

,发现它被称为2,180,000倍,真棒!号

和上面提到的children方法将绝对堪称同大人数太多,该children方法在CXMLNode.m文件TouchXML定义如下:

- (NSArray *)children 
     { 
     NSAssert(_node != NULL, @"TODO"); 

     NSMutableArray *theChildren = [NSMutableArray array]; 
     xmlNodePtr theCurrentNode = _node->children; 
    while (theCurrentNode != NULL) 
    { 
    CXMLNode *theNode = [CXMLNode nodeWithLibXMLNode:theCurrentNode]; 
    [theChildren addObject:theNode]; 
    theCurrentNode = theCurrentNode->next; 
    } 
     return(theChildren);  
    } 

,所以你可以想像多回路怎么回事然而,在这里,我运行了应用程序,并注意到我的应用程序在使用此Web服务并执行特定操作后崩溃(由于内存不足),但如果我在不使用Web服务的情况下执行这些特定操作(在我的应用程序中)我的应用程序不会崩溃,因为我的代码中没有内存泄漏或内存相关的问题。 我的要求是使用该应用程序与Web服务,而不会从崩溃..

任何建议将高度赞赏解决这个问题。

您每次通过此代码创建一些自动释放对象,例如children方法返回的数组。这些不会被释放,直到你耗尽了它们创建的autorelease池为止。通常这是在下一次通过运行循环完成的。但是,如果在一个紧密循环内创建大量自动释放对象,就好像你正在做的那样,你需要在循环内部创建自己的自动释放池。最明智的做法取决于代码的细节。 Apple的文档有关于using local autorelease pools to reduce peak memory footprint的讨论。请注意,此文档仍指代创建NSAutoreleasePool对象而不是更现代的@autoreleasepool {}

+0

谢谢你的重要提示,你觉得如果我把autorelease pool放在children方法里面,会不会影响解析xml标签的解析器速度?因为children方法是我没有写的方法,所以它是TouchXML库的一部分。 – JAHelia 2012-07-21 10:43:01

+0

顺便说一下,我将无法在子方法中使用autorelease池,因为无法排除该方法中的池,因为存在返回的数组。 – JAHelia 2012-07-21 11:49:19

+1

你想在子方法之外执行它,因为这些数组可能是构建最大的东西。您必须重构getNode:withName:但您可以将大部分代码包装在autoreleasepool中,保留想要返回的任何内容,退出该池,然后在返回语句中自动释放返回的对象。 – 2012-07-21 15:07:56