2011-05-19 76 views
1

在这里,我想解析来自我的应用程序的服务器端的XML数据。但是这个代码显示仪器泄漏。NSXMLParser泄漏

TPatient是具有以下变量的NSObject: 名字,姓氏,出生日期,电话,电子邮件,密码,图表,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) 
    { 
     [email protected]""; 
    } 
    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

代码太多。你需要做更多的工作来告诉我们什么在泄漏。然后清理代码,直到找到泄漏的位置。 – drekka 2011-05-19 04:14:26

+0

仪器正在显示didstartElement部分中的对象声明curr_patient = [TPatient new]上的泄漏。并且还显示了foundCharacters部分中的last_string部分 – 2011-05-19 04:20:01

+0

的泄漏,请检查并获取一些想法:http://gigaom.com/apple/tutorial-build-a-simple-rss-reader-for-iphone/ – 2011-05-19 05:24:39

回答

0

变化:

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]