私はSudzC
xml Web サービスの目的の C ラッパーとして使用しています。ご存知のように、最高かつ最速の xml パーサーの 1 つと見なされているものをSudzC
使用しています。TouchXML
xml 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.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 サービスでアプリを使用することです..
この問題を解決するための提案をいただければ幸いです。