Reputation: 1511
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
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