2012-03-19 5 views
0

меня странная проблема утечки памяти,Ошибка утечки памяти во время разбора xml?

Теперь мой код,

-(NSMutableDictionary *)getParsedWallpaperData{ 
NSMutableDictionary *dataDictionary = [NSMutableDictionary dictionary]; 

NSData *xmlData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Wallpaper" ofType:@"xml"]]; 
TBXML *tbXml = [[TBXML alloc] initWithXMLData:xmlData error:nil]; 

//TBXML *tbXml = [[TBXML tbxmlWithXMLData:xmlData error:nil] autorelease]; 

@synchronized(self){ 
    TBXMLElement *rootXMLElement = tbXml.rootXMLElement; 

    if(rootXMLElement) 
    { 
     TBXMLElement *paging = [TBXML childElementNamed:kPaging parentElement:rootXMLElement]; 
     NSMutableDictionary *pagingData = [[NSMutableDictionary alloc] init]; 
     if(paging){ 
      TBXMLElement *totalPages = [TBXML childElementNamed:kTotalPages parentElement:paging]; 
      NSString *totalPagesString = [TBXML textForElement:totalPages]; 
      [pagingData setObject:totalPagesString forKey:@"TotalPages"]; 

      TBXMLElement *currentPage = [TBXML childElementNamed:kCurrentPage parentElement:paging]; 
      NSString *currentPageString = [TBXML textForElement:currentPage]; 
      [pagingData setObject:currentPageString forKey:@"CurrentPage"]; 

      TBXMLElement *prevPage = [TBXML childElementNamed:kPerviousPage parentElement:paging]; 
      NSString *prevPageString = [TBXML textForElement:prevPage]; 
      [pagingData setObject:prevPageString forKey:@"PreviousPage"]; 

      TBXMLElement *nextPage = [TBXML childElementNamed:kNextPage parentElement:paging]; 
      NSString *nextPageString = [TBXML textForElement:nextPage]; 
      [pagingData setObject:nextPageString forKey:@"NextPage"]; 
     } 
     [dataDictionary setObject:pagingData forKey:@"PagingInfo"]; 
     [pagingData release]; 
     pagingData = nil; 

     TBXMLElement *totalItems = [TBXML childElementNamed:kTotalItems parentElement:rootXMLElement]; 
     NSString *totalItemsString = [TBXML textForElement:totalItems]; 
     [dataDictionary setObject:totalItemsString forKey:@"TotalItems"]; 

     NSMutableArray *itemArray = [[NSMutableArray alloc] initWithCapacity:[totalItemsString intValue]]; 

     TBXMLElement *items = [TBXML childElementNamed:kItems parentElement:rootXMLElement]; 
     if(items){ 
      TBXMLElement *item = [TBXML childElementNamed:kItem parentElement:items]; 
      while (item) { 
       NSMutableDictionary *itemInfoDict = [[NSMutableDictionary alloc] init]; 
       TBXMLElement *title = [TBXML childElementNamed:kTitle parentElement:item]; 
       NSString *titleString = [TBXML textForElement:title]; 
       [itemInfoDict setObject:titleString forKey:@"Title"]; 

       TBXMLElement *image1 = [TBXML childElementNamed:kImage1 parentElement:item]; 
       NSString *image1String = [TBXML textForElement:image1]; 
       [itemInfoDict setObject:image1String forKey:@"Image1"]; 

       TBXMLElement *image2 = [TBXML childElementNamed:kImage2 parentElement:item]; 
       NSString *image2String = [TBXML textForElement:image2]; 
       [itemInfoDict setObject:image2String forKey:@"Image2"]; 

       TBXMLElement *image3 = [TBXML childElementNamed:kImage3 parentElement:item]; 
       NSString *image3String = [TBXML textForElement:image3]; 
       [itemInfoDict setObject:image3String forKey:@"Image3"]; 

       TBXMLElement *thumbnail = [TBXML childElementNamed:kThumbnail parentElement:item]; 
       NSString *thumbnailString = [TBXML textForElement:thumbnail]; 
       [itemInfoDict setObject:thumbnailString forKey:@"Thumbnail"]; 

       [itemArray addObject:itemInfoDict]; 
       [itemInfoDict release]; 
       itemInfoDict = nil; 
       item = item -> nextSibling; 
      } 
     } 
     [dataDictionary setObject:itemArray forKey:@"ImagesInfo"]; 
     [itemArray release]; 
     itemArray = nil; 
    } 
} 

[tbXml release]; 
tbXml = nil; 
return dataDictionary; 
} 

я обнаружил утечку памяти только TBXML * tbXml = [[TBXML Alloc] initWithXMLData: XMLDATA ошибка: ноль]; на этой линии, хотя я вручную освобождаю tbXml объект,

Пожалуйста, предложите мне это сделать?

Спасибо,

+0

Вы проверили, есть ли утечка в библиотеке TBXML? – freespace

+0

@freespace, я думаю, что может быть утечка в библиотеке TBXML, потому что, когда я отлаживаю свой код с помощью анализатора, он не дал мне никаких проблем в моем коде ... но он показывает много проблем в библиотеке TBXML ...: ( – Tirth

+1

Затем (a) отправьте отчет об ошибке в TBXML или (b) прекратите использование TBXML или (c) прекратите использование XML. Я рекомендую вариант (c). – freespace

ответ

1

Ну, если это корневой элемент, что там показано, как протечки, мне интересно, если один из аксессорах как childElementNamed вызывает его (возвращая то, что действует как NSString, но на самом деле также имеет оптимизированные указатели, сохраненные обратно в корневой элемент). Можете ли вы взглянуть на реализацию childElementNamed? Относительно быстрый способ изменить код, чтобы убедиться, что это не так, чтобы обернуть любой результат NSString, который вы собираетесь хранить в своем dataDictionary там с вызовом [NSString stringWithFormat:@"%@", [TBXML textForElement:fooTitle]].

Кроме того, вы можете обернуть эту функцию в макросе @nsautoreleasepool, если TBXML создает много объектов с автореализацией.

Как окончательное предложение, вы должны посмотреть ARC, если сможете (то есть, если вы развертываете iOS 4+).

+0

Я запускаю код для записи в среде ARC на самом деле, но мой клиент изменил требование, он сказал, что я хочу предоставить средство для пользователя paly cocos2d в приложении. И этот игровой код несовместим с ARC, поэтому я выбираю не-ARC-приложение ... :( – Tirth

+0

Я получил 100% -ную утечку в инструменте на TBXML * tbXml = [[TBXML alloc] initWithXMLData: xmlData error: nil]; эта строка – Tirth

+0

Да, но это не значит, что проблема в TBXML. Что-то ссылается на память, которая была выделена на этой строке, поэтому проблема находится где-то в другом месте. –

0

Добавьте эту строку в верхней части вашей функции:

NSAutoreleasePool *Pool=[[NSAutoreleasePool alloc]init]; 

и добавьте эту строку в нижней части вашей функции перед «вернуться» заявление:

[Pool drain]; 

Может это поможет вам ,

+0

его не сработало для меня. – Tirth

+0

Замените [Слив бассейна]; к [Пул релиз]; линия. – Kuldeep

+0

его тоже не работает для меня :( – Tirth

Смежные вопросы