2012-07-21 83 views
0

我使用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服務,而不會從崩潰..

任何建議將高度讚賞解決這個問題。

回答

1

您每次通過此代碼創建一些自動釋放對象,例如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