2011-05-19 77 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]