Освобождение объектов Xmlparser и NSXMLParser - PullRequest
0 голосов
/ 15 января 2011

Как можно безопасно освободить переменные xmlParser и parser в функции ниже?

- (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;
}

1 Ответ

1 голос
/ 15 января 2011

Есть два способа:

- (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;
}

В этом случае xmlParser будет выпущено позже в конце текущей обработки цикла выполнения, так что dictionaryArray будет действительным при возврате.

Второй способ:

- (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;
}

В этом случае xmlParser будет освобожден настолько, насколько это возможно.

(Кстати, не забудьте выпустить parser)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...