erastusnjuki
erastusnjuki

Reputation: 1511

Releasing Xmlparser and NSXMLParser objects

How can I release the variables xmlParser and parser safely in the function below?

- (id)callRestService: (NSString *) methodName : (NSDictionary *) params
{
    NSURL *url=[self getRestUrl: methodName : params];
    XmlParser *xmlParser = [[XmlParser alloc] init];

    NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
    [parser setDelegate:xmlParser];
    [parser setShouldProcessNamespaces:NO];
    [parser setShouldReportNamespacePrefixes:NO];
    [parser setShouldResolveExternalEntities:NO];
    [parser parse];
    [parser setDelegate:nil];



    return xmlParser.dictionaryArray;
}

Upvotes: 0

Views: 709

Answers (1)

Yuras
Yuras

Reputation: 13876

There are two ways:

- (id)callRestService: (NSString *) methodName : (NSDictionary *) params
{
    NSURL *url=[self getRestUrl: methodName : params];
    XmlParser *xmlParser = [[[XmlParser alloc] init] autorelease]; // !!!

    NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
    [parser setDelegate:xmlParser];
    [parser setShouldProcessNamespaces:NO];
    [parser setShouldReportNamespacePrefixes:NO];
    [parser setShouldResolveExternalEntities:NO];
    [parser parse];
    [parser setDelegate:nil];
    [parser release];

    return xmlParser.dictionaryArray;
}

In that case xmlParser will be release later at the end of the current run loop processing, so that the dictionaryArray will be valid when returned.

The second way:

- (id)callRestService: (NSString *) methodName : (NSDictionary *) params
{
    NSURL *url=[self getRestUrl: methodName : params];
    XmlParser *xmlParser = [[XmlParser alloc] init];

    NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
    [parser setDelegate:xmlParser];
    [parser setShouldProcessNamespaces:NO];
    [parser setShouldReportNamespacePrefixes:NO];
    [parser setShouldResolveExternalEntities:NO];
    [parser parse];
    [parser setDelegate:nil];
    [parser release];
    [xmlParser.dictionaryArray autorelease]; // !!!
    [xmlParser release]; // !!!

    return xmlParser.dictionaryArray;
}

It that case xmlParser will be deallocated as soom as possible.

(BTW, don't forget to release the parser)

Upvotes: 1

Related Questions