2010-01-30 1 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 여러 번이 라인의 동일한 유형을 분석하면 (의미가) 누출 : XML 파서의 동일한 유형을 다시 요청 때마다 나는 몇 가지를 시도

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

아직 대리자의 인스턴스와 인스턴스 변수를 생성하고 방출 등이 문제를 해결하려면 그것은 작동하지 않았다.

나는 여기에서 어떤 도움도 기쁘게 생각합니다.

답변

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

나는 코드를 리팩토링