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 {}
。
谢谢你的重要提示,你觉得如果我把autorelease pool放在children方法里面,会不会影响解析xml标签的解析器速度?因为children方法是我没有写的方法,所以它是TouchXML库的一部分。 – JAHelia 2012-07-21 10:43:01
顺便说一下,我将无法在子方法中使用autorelease池,因为无法排除该方法中的池,因为存在返回的数组。 – JAHelia 2012-07-21 11:49:19
你想在子方法之外执行它,因为这些数组可能是构建最大的东西。您必须重构getNode:withName:但您可以将大部分代码包装在autoreleasepool中,保留想要返回的任何内容,退出该池,然后在返回语句中自动释放返回的对象。 – 2012-07-21 15:07:56