0

如您所知,我将其SudzC用作我的 xml Web 服务的 Objective-c 包装器,它被认为是最好和最快的 xml 解析器之一。在加载我的 xml Web 服务、解析它并最终将其保存到核心数据时,它会在数据库中生成大约 2500 条记录,因此它是一项大型服务。我注意到一些奇怪的事情,我在以下方法中 放置了声明的文件:SudzCTouchXMLsoap.mNSLog

         + (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 服务一起使用,而不会发生崩溃。

任何解决此问题的建议将不胜感激。

4

1 回答 1

1

您每次都通过此代码创建一些自动释放的对象,例如children方法返回的数组。在您耗尽创建它们的自动释放池之前,它们不会被释放。通常这是在下次通过运行循环时为您完成的。但是,如果在一个紧密的循环中创建大量自动释放对象,就像您正在做的那样,您将需要在循环中创建自己的自动释放池。最有意义的地方取决于代码的细节。Apple 的文档讨论了使用本地自动释放池来减少峰值内存占用。注意,这个文档仍然是指创建NSAutoreleasePool对象而不是更现代的@autoreleasepool {}.

于 2012-07-21T10:08:04.487 回答