我使用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服務,而不會從崩潰..
任何建議將高度讚賞解決這個問題。
謝謝你的重要提示,你覺得如果我把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