首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSXMLParser泄漏

NSXMLParser泄漏
EN

Stack Overflow用户
提问于 2011-05-19 12:09:51
回答 1查看 247关注 0票数 1

在这里,我试图解析来自应用程序服务器端的xml数据。但是这段代码显示了仪器的泄漏。

TPatient是带有以下变量的NSObject : FirstName,LastName,BirthDate,Phone,Email,Password,Chart,Referredby,RecordConsult,Doctor,Assistant,Notes,PatientStatus,PatientUUID。

代码语言:javascript
复制
-(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];
}   

有人能帮我找出下面代码中的内存泄漏吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-05-19 14:15:19

更改:

代码语言:javascript
复制
self.curr_patient_array = [NSMutableArray new];

至:

代码语言:javascript
复制
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]相同。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6053658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档