2010-01-30 36 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解析器被要求再次,還它沒有工作。

我很高興有任何幫助,非常感謝!

回答

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]; 
}