2012-02-29 10 views
0

Привет всем Я использую rss-ридер, предоставленный Ray, который замечательный. Приложение должно разбирать довольно большой XML-файл размером около 7 МБ. Процесс отлично работает, и я могу загрузить и проанализировать содержимое и сохранить его в базе данных. Однако у меня большая проблема с памятью. При работе в Инструментах он достигает около 30 Мб, и хотя он всего лишь на 30-40 секунд, он сбрасывает приложение, когда я выполняю загрузку и синтаксический анализ при первом запуске.GDataXMLDocument Memory Увеличивает

Любая помощь по этому вопросу будет оценена по достоинству. Код, который я считаю, приводит к тому, основной проблемой является: сайт

- (void)requestFinished:(ASIHTTPRequest *)request { 


    //////// problem code ///////// 
     NSError *error; 

    GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:[request responseData] 
                 options:0 error:&error]; 
    [_queue addOperationWithBlock:^{ 

    if (doc == nil) { 


    } else { 

     entries = [NSMutableArray array]; 

     [self parseFeed:doc.rootElement entries:entries];     

     [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 

      for (RSSEntry *entry in entries) { 

       int insertIdx = [_allEntries indexForInsertingObject:entry sortedUsingBlock:^(id a, id b) { 
        RSSEntry *entry1 = (RSSEntry *) a; 
        RSSEntry *entry2 = (RSSEntry *) b; 
        return [entry1.articleDate compare:entry2.articleDate]; 


        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
        //... do everything I've done before... 
        [pool drain]; 


       }]; 

       [_allEntries insertObject:entry atIndex:insertIdx]; 

       entries = 0; 

      }        

     }]; 

    } 

     //[doc release]; 
     //doc = nil; 

}]; 

[doc release]; 
doc = nil; 
[error release]; 

} 
+0

Возможно, в другом месте есть утечка памяти. – yoninja

ответ

0

Ray Wenderlich также есть статья о advantages of various XML parsers. У анализатора GDataXML, похоже, есть один из более крупных следов памяти, и вам, возможно, придется перейти на что-то вроде TBXML.

+0

Спасибо, я попробовал TMXML один, и он по-прежнему использует память до 32 МБ. Фактический файл составляет всего 7 МБ, поэтому я не могу понять, почему он так сильно увеличивает его. Должен ли я рассматривать SAX-парсер? любые рабочие примеры будут действительно оценены. – mediavu

+0

Извините, я не понял, что TBXML является парсером DOM. Вы должны попробовать SAX-парсер. Встроенный в NSXMLParser немного сложно использовать, но я использовал код с сайта Big Nerd Ranch (http://weblog.bignerdranch.com/?p=48), чтобы узнать его. XML, который я разбирал, составлял всего около 1 МБ, но он обрабатывал его на iPhone 3G, который имеет очень мало памяти. Я предполагаю, что память увеличивается, потому что DOM-парсер хранит XML-документ в памяти, а затем создает много объектов из него одновременно. Объекты, вероятно, больше, чем представление XML. –

+0

Привет, у вас есть рабочий пример, который я мог бы просмотреть. Еще раз спасибо за быстрый ответ. – mediavu