Не можете найти утечку в этом коде NSXMLParser Objective-C? - PullRequest
0 голосов
/ 19 февраля 2010

Я новичок в программировании для iPhone и запускаю свое приложение на инструменте Leaks в Инструментах. Инструмент обнаруживает несколько утечек, каждая из которых, по-видимому, указывает на 1 строку кода в классе, который использует NSXMLParser:

- (BOOL)parse{  
    NSURL *url = [[NSURL alloc] initWithString:@"[url here]"];
    NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
    [parser setDelegate:self];
    NSLog(@"NSXMLParser initialized");

    [parser parse];

    [url release];
    [parser release];
    return YES;
}

Инструмент указывает на линию, создающую синтаксический анализатор как имеющую утечку:

NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url];

Кто-нибудь может указать мне правильное направление на этом? Я уже целый час провожу подсчет ссылок в своем коде, но безуспешно.

UPDATE:

Хорошо, принимая предложения из 2 ответов, я добавил эти строки перед созданием NSURL:

[[NSURLCache sharedURLCache] setMemoryCapacity:0];
[[NSURLCache sharedURLCache] setDiskCapacity:0];

И я добавил эту строку прямо перед выпуском парсера:

[parser setDelegate:nil];

Каждое добавление уменьшало количество утечек, и теперь я уменьшился до 2. Один указывает на CFNetwork и один указывает на Foundation как ответственную библиотеку. Изучение стека вызовов на обоих не показывает никакого моего кода вообще.

Есть что-нибудь еще, что я мог бы сделать здесь неправильно?

Ответы [ 4 ]

1 голос
/ 19 февраля 2010

Если это действительно весь ваш код, то он действительно звучит так, как будто в базовой структуре есть утечка.Заархивируйте пример программы и сообщите об ошибке , пожалуйста.

Однако, это не весь код - если ваш метод делегата сохраняет что-то и не уравновешивает его с помощьювыпуск, это приведет к утечке.Эта путаница может быть вызвана тем, что прибор Leaks показывает точку выделения объекта, когда фактическая утечка может быть вызвана последующим retain.

использованием инструмента Object Alloc и обнаружением утечек.в частности, вы можете развернуть список, чтобы точно определить, кто удерживает и освобождает какой-либо данный объект.Это может пролить некоторый свет на ситуацию.

1 голос
/ 19 февраля 2010

Вы пытались установить делегат анализатора на nil перед его освобождением?Некоторые классы, как правило, сохраняют своих делегатов ...

РЕДАКТИРОВАТЬ:

На самом деле я не видел, чтобы анализатор был NSXMLParser экземпляром.Читая документы, я вижу, что они утверждают, что: " Это не сохраняется. ".Тем не менее, я бы попробовал.

1 голос
/ 19 февраля 2010

Я нашел по этому вопросу в другой теме:

[[NSURLCache sharedURLCache] setMemoryCapacity:0];
[[NSURLCache sharedURLCache] setDiskCapacity:0];
NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:URL];

(источник: другая тема переполнения стека )

Но я не тестировал это решение.

0 голосов
/ 16 мая 2011

У меня была такая же проблема, и я подозреваю, что утечка находится в базовой структуре.

Я изменил свой код с:

NSXMLParser * parser = [[NSXMLParser alloc] initWithContentsOfURL:fileName];

к этому:

NSData * fileData = [[NSData alloc] initWithContentsOfURL:fileName];
NSXMLParser * parser = [[NSXMLParser alloc] initWithData:fileData];
[parser setDelegate:self];
[parser parse];
[parser release]; 
[fileData release];

и утечка исчезла.

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