Почему я получаю такую ​​огромную утечку памяти в заданном вложенном цикле for? этот цикл читает данные из XML - PullRequest
0 голосов
/ 05 ноября 2011

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

    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?

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

Ответы [ 3 ]

1 голос
/ 05 ноября 2011

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

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

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

0 голосов
/ 05 ноября 2011

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

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

0 голосов
/ 05 ноября 2011

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

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

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

Вам следует взглянуть на класс ParseOperation .

...