Почему я получаю такую огромную утечку памяти в данном вложенном цикле for? этот цикл считывает данные из xml

#objective-c #memory-leaks #for-loop #release #xcode3.2

#objective-c #утечки памяти #цикл for #выпуск #xcode3.2

Вопрос:

Ниже приведен мой блок кода:

     NSArray *innerArrayOfItems = [dictionaryOfItems objectForKey:kXMLNodeChildArray];
    NSString *key = [[NSString alloc] init];
    NSString *value = [[NSString alloc] init];

    for (NSDictionary *innerDictionaryOfItems in innerArrayOfItems) 
    {
      NSArray *keyValueOfString = [innerDictionaryOfItems objectForKey:kXMLNodeChildArray];

      for (NSDictionary *innerDictonaryOfkeyValueOfString in keyValueOfString)
      {
        if ([[innerDictonaryOfkeyValueOfString objectForKey:kXMLNodeName] isEqualToString:@"Key"])
        {
          key = [innerDictonaryOfkeyValueOfString objectForKey:kXMLNodeContent];
        }

        if ([[innerDictonaryOfkeyValueOfString objectForKey:kXMLNodeName] isEqualToString:@"Value"])
        {
          value = [innerDictonaryOfkeyValueOfString objectForKey:kXMLNodeChildArray];
          NSArray *valueArray = [innerDictonaryOfkeyValueOfString objectForKey:kXMLNodeChildArray];

          for (NSDictionary *valueDictionary in valueArray) 
          {
            if ([[valueDictionary objectForKey:kXMLNodeName] isEqualToString:@"ItemTypeAlias"])
           {
             for (NSDictionary *entity_Key_ViewNameDictionary in theDelegate.entity_Key_ViewNameArray) 
             {
               if ([[[entity_Key_ViewNameDictionary allValues] objectAtIndex:0] 
                      isEqualToString:[valueDictionary objectForKey:kXMLNodeContent]])
               {
                 [dataTableArrayDeleted addObject:[[entity_Key_ViewNameDictionary allKeys] objectAtIndex:0]];
                 break;
               }
             }
             //Getting DataTable Primary Key column name

             for (NSDictionary *tables_PrimaryKey_TableNameDictionary 
                  in theDelegate.tables_PrimaryKey_TableNameArray) 
             {
               if ([[[tables_PrimaryKey_TableNameDictionary allKeys] objectAtIndex:0] 
                      isEqualToString:[dataTableArrayDeleted lastObject]])

               {
                 [dataTableKeyColumnArrayDeleted 
                   addObject:[[tables_PrimaryKey_TableNameDictionary allValues] objectAtIndex:0]];

                 isDataAvailabeleForSaveDelete = TRUE;
                 break;
               }
             }
           }
         }
       }
     }

    [self saveGetDataUpdatesDeletedData:key :value];
  }
  

Приведенный выше код, посмотрите на объекты, заполненные анализатором xml, и посмотрите внутри каждого узла от родительского узла до дочерних узлов (условно) ,

В xml есть еще один блок, который представляет собой дополнительную информацию из вышеупомянутой коллекции узлов xml, после просмотра внутри вышеупомянутого цикла он сохранит все найденные значения для объекта, а затем перейдет к другому блоку и подробному поиску сохраненных значений.

Есть ли какой-либо другой правильный способ чтения / разбора xml и сохранения значений в переменных?

Спасибо, Имран Ризви

Комментарии:

1. доступно множество анализаторов XML. Попробуйте NSXMLParser для начала с.

Ответ №1:

Вы выделяете key и value , но позже вы просто перезаписываете их, не освобождая

 NSString *key = [[NSString alloc] init];
NSString *value = [[NSString alloc] init];
  

вероятно, лучше изначально установить для них значение nil.

Комментарии:

1. Можете ли вы отправить код, чтобы изначально установить для них значение nil, если я сразу после выделения установлю для него значение nil, не приведет ли это к исключению/

2. после повторного посещения проекта и изменения всех этих исправлений пропусков, наконец, мы преодолели проблему

Ответ №2:

Вы должны использовать NSXMLParser, вот пример:

Пример взят из библиотеки разработчиков iOS. Вот краткий обзор примера:

Пример приложения SeismicXML демонстрирует, как использовать NSXMLParser для анализа XML-данных. Когда вы запускаете приложение, оно загружает и анализирует RSS-канал от Геологической службы США (USGS), который предоставляет данные о недавних землетрясениях по всему миру. Он отображает местоположение, дату и магнитуду каждого землетрясения, а также цветовую графику, которая указывает на серьезность землетрясения. Синтаксический анализ XML происходит в фоновом потоке с использованием NSOperation и обновляет представление таблицы earthquakes пакетами проанализированных объектов.

Вы должны посмотреть на класс ParseOperation.

Ответ №3:

Не настоящий ответ.. но как насчет использования TBXML

это быстро, легко, и вы можете легко очистить память! Если вы новичок, я настоятельно рекомендую TBXML.