Утечка памяти с NSXMLParser - PullRequest
       25

Утечка памяти с NSXMLParser

0 голосов
/ 28 февраля 2011

Я пишу приложение, которое использует NSXMLParser для анализа информации с веб-сайта и сохранения ее в моем приложении.Я выпускаю синтаксический анализатор, который я создаю в своем блоке @finally, но Instruments все еще показывает его как утечку памяти.Поведение приложения, кроме этого, идеально.Вот код:

NSXMLParser *myParser = [[NSXMLParser alloc] initWithContentsOfURL:xmlURL]; //<--memory leak

@try {

    if (myParser != nil)
    {
        [myParser setDelegate:self];
        [myParser setShouldProcessNamespaces:NO];
        [myParser setShouldReportNamespacePrefixes:NO];
        [myParser setShouldResolveExternalEntities:NO];
    }

    [myParser parse];

}
@catch (NSException * e) {
    NSLog(@"%@, %@",[e name], [e reason]);
}
@finally {
    [xmlURL release];
    [myParser release];
}

Любые рекомендации относительно того, почему это проявляется как утечка памяти?

** EDIT ***

Ниже приведен метод делегата, который я реализовал в своем коде:

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI
(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
if ([elementName isEqualToString:@"Cube"])
{
    if ([attributeDict objectForKey:@"time"])
    {
        NSArray *pathsArray =
        NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *path = [pathsArray objectAtIndex:0];
        NSString *timePlistPath = [NSString stringWithString:
            [path stringByAppendingString:@"/time.plist"]];

        NSString *TimeString = [attributeDict objectForKey:@"time"];
        [TimeString writeToFile:timePlistPath atomically:YES
            encoding:NSUnicodeStringEncoding error:nil];
    }

    if ([attributeDict objectForKey:@"currency"] && [attributeDict objectForKey:@"rate"])
    {
        NSString *currencyObject = [attributeDict objectForKey:@"currency"];
        NSString *rateObject = [attributeDict objectForKey:@"rate"];
        [mAryCurrency addObject:currencyObject];
        [mAryRates addObject:rateObject];
    }
}

}

Может ли это быть причиной утечки

1 Ответ

0 голосов
/ 28 февраля 2011

Это потому, что он находится в @finally, вероятно, когда он проверяет его, скорее всего, предполагая, что @finally не будет вызван, если он будет обнаружен как утечка в Build & Analyze, я бы проигнорировал его.

Даже Apple рекомендует выпускать в @finally:

    - (void)doSomething {

    NSMutableArray *anArray = nil;

    array = [[NSMutableArray alloc] initWithCapacity:0];

    @try {

        [self doSomethingElse:anArray];

    }

    @finally {

        [anArray release];

    }
}
...