2010-01-30 2 views
0

Я создаю приложение, которое должно обрабатывать разбор нескольких различных типов файлов XML. Поскольку я хочу стандартизировать процедуру как можно больше, я создал одноэлементный класс, который обрабатывает разбор любых XML-данных. Класс передается двумя параметрами, уникальным идентификатором, указывающим, какие данные XML он будет анализировать и сами данные. В классе имеется следующая функция, которая делает синтаксический и возвращает объект NSMutableArray, содержащий результаты:Дефрагментатор XMLParser и утечки памяти

- (NSMutableArray*) initAPIDataParse:(NSData *)data APIRequestType:(int)requestType { 

    // Init parser 
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data]; 

    // Set delegate for parser 
    if (requestType == kXMLParserTypeOne) { 
     [parser setDelegate:[[[XMLParserOne alloc] init] autorelease]]; 
    } else if (requestType == kXMLParserTypeTwo) { 
     [parser setDelegate:[[[XMLParserTwo alloc] init] autorelease]]; 
    } // etc. 

    // let's parse the XML 
    [parser parse]; 

    [parser release]; 

    return lastParsedDict; //lastParsedDict is the NSMutableArray object returned from the Parser delegate 
} 

Приведенный выше код работает как шарм, за исключением того, что если вы разбираете тот же тип XML несколько раз эта линия утечки (что имеет смысл):

[parser setDelegate:[[[XMLParserOne alloc] init] autorelease]]; 

я пытался несколько вещей, чтобы решить эту проблему, как создать переменный экземпляр с экземпляром делегата и отпуская его всякий раз, когда тот же самый тип XML Parser попросили еще раз, пока это не сработало.

Я рад за любую помощь здесь, спасибо большое!

ответ

1

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

Я переработан код:

- (NSMutableArray*) parseData: (NSData*) data withAPIRequestType: (int) requestType 
{ 
    NSMutableArray* result = nil; 

    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data]; 
    if (parser != nil) 
    { 
     switch (requestType) { 
      case kXMLParserTypeOne: 
       delegate = [XMLParserOne new]; 
       break; 
      case kXMLParserTypeTwo: 
       delegate = [XMLParserTwo new]; 
       break;    
     } 

     if (delegate != nil) 
     { 
      [parser setDelegate: delegate]; 
      [parser parse]; 
      result = [delegate.result retain]; 

      [delegate release]; 
     } 

     [parser release]; 
    } 

    return [result autorelease]; 
} 
Смежные вопросы