NSXMLParser текущий - PullRequest
       14

NSXMLParser текущий

1 голос
/ 19 мая 2011

Здесь я пытаюсь проанализировать данные XML, поступающие со стороны сервера моего приложения. Но этот код показывает утечку на инструментах.

TPatient - это NSObject со следующей переменной: FirstName, LastName, BirthDate, телефон, электронная почта, пароль, дерево, Referredby, RecordConsult, доктор, помощник, отмечает, PatientStatus, PatientUUID.

-(NSMutableArray *)FromXML:(NSString *)xmlstring
{

    curr_patient = nil;
    self.curr_patient_array = nil;
    last_string = nil;
    NSData *data = [xmlstring dataUsingEncoding:NSUTF8StringEncoding];
    NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:data];
    [xmlParser setDelegate:self];

    [xmlParser parse];
    [xmlParser setDelegate:nil];
    [xmlParser release];


    if(curr_patient!=nil) {
        [curr_patient release];
        curr_patient=nil;
    }


    if(last_string!=nil)
    {
        [last_string release];
        last_string=nil;
    }
    while ( PARSE_STATE == 0 )
        ;

    if ( PARSE_STATE == 1 ) {
        if ( self.curr_patient_array!= nil ) {
            [self.curr_patient_array release ];
            self.curr_patient_array = nil; 
            return nil; 
        }

    }
    if ( self.curr_patient_array == nil )
        return nil;

    return [self.curr_patient_array autorelease];

}

-(void)parser:(NSXMLParser*)parser didStartElement:(NSString *)
elementName namespaceURI:(NSString  *)namespaceURI qualifiedName:
(NSString *)qName attributes:(NSDictionary  *)attributeDict

{


    if ( [elementName isEqualToString:@"Patients" ] == YES )
    {
        if(self.curr_patient_array !=nil)
        {
            [self.curr_patient_array release];
            self.curr_patient_array=nil;
        }
        self.curr_patient_array = [NSMutableArray new ];
    }
    else if ( [elementName isEqualToString:@"Patient" ] == YES )
    {

        if ( curr_patient != nil )
            [curr_patient release ];

        curr_patient = [TPatient new ];

    }

}



-(void)parser:(NSXMLParser*)parser didEndElement:(NSString *)elementName 
 namespaceURI:(NSString*)
namespaceURI qualifiedName:(NSString *)qName

{


    NSString *curString;
    if(last_string==nil)
    {
        curString=@"";
    }
    else
    {
        curString=last_string;
        [curString retain];
    }
    if ( [elementName isEqualToString:@"Patientid" ] == YES )
    {
        NSInteger it = [ curString intValue];
        curr_patient.PatientId = it;

        [last_string release ];
        last_string=nil;

    }
    else if ( [elementName isEqualToString:@"Patient" ] == YES )
    {
        [self.curr_patient_array addObject:curr_patient ];
        [curr_patient release];
        curr_patient = nil;     
    } 

    [curString release];


}


-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{

    last_string = [NSString stringWithFormat:@"%@"
                   ,string];
    [last_string retain];
}   

Может ли кто-нибудь помочь мне найти утечку памяти в следующем коде.

1 Ответ

0 голосов
/ 19 мая 2011

Изменение:

self.curr_patient_array = [NSMutableArray new];

На:

NSMutableArray *newPatientArray = [NSMutableArray new];
self.curr_patient_array = newPatientArray;
[newPatientArray release];

Также curr_patient = [TPatient new]; может оказаться проблемой.Каждый раз, когда вы звоните по этой линии, вы должны быть уверены, что выпустите ее где-нибудь.Возможно, вы захотите переключить его на синтезированную переменную, такую ​​как NSMutableArray выше, и распределить ее таким же образом.

И прочитайте это: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmPractical.html#//apple_ref/doc/uid/TP40004447

Обратите внимание, что [NSObject new] совпадает с [[NSObject alloc] init].

...