0

私はSudzCxml Web サービスの目的の C ラッパーとして使用しています。ご存知のように、最高かつ最速の xml パーサーの 1 つと見なされているものをSudzC使用しています。TouchXMLxml Web サービスをロードして解析し、最終的にコア データに保存すると、データベースに約 2500 のレコードが生成されるため、一種の大きなサービスになります。私は何か奇妙なことに気付きました.soap.mファイルNSLogは次のメソッドにステートメントを配置しました:

         + (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.mTouchXML

 - (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 サービスでアプリを使用することです..

この問題を解決するための提案をいただければ幸いです。

4

1 に答える 1

1

メソッドによって返される配列など、このコードを使用して毎回いくつかの自動解放オブジェクトを作成していますchildren。これらは、それらが作成された自動解放プールを排出するまで解放されません。通常、これは次回の実行ループで行われます。ただし、あなたがやっているように、タイトなループ内に多くの自動解放されたオブジェクトを作成する場合は、ループ内に独自の自動解放プールを作成する必要があります。これを行うのが最も理にかなっている場所は、コードの詳細によって異なります。Apple のドキュメントには、ローカルの自動解放プールを使用してピーク メモリ フットプリントを削減することについての説明があります。このドキュメントNSAutoreleasePoolでは、より現代的な ではなく、オブジェクトの作成について言及しています@autoreleasepool {}

于 2012-07-21T10:08:04.487 に答える