2011-01-04 3 views
1

Может ли кто-нибудь сказать мне, почему NSAutoreleasePool протекает в этом коде. Я использую инструменты для проверки утечек. & этот код как-то просачивается. Может ли кто-нибудь вести меня в правильном направлении. У меня есть тот же самый код в другом месте & его работает отлично.NSAutoReleasePool Leaking

ASIHTTPRequest *request = [[ASIHTTPRequest alloc] initWithURL:self.url]; 
[request setDelegate:self]; 

NSOperationQueue *queue = self.downloadQueue; 
[queue addOperation:request]; 
[request release]; 
+1

Остается ли утечка, если вы добавите '[queue release]' после '[request release]'? –

ответ

2

Он должен исчезнуть, если вы создадите NSAutoreleasePool вокруг этого кода. Обычно это происходит, если этот код не запускается в основном потоке.

NSAutoreleasePool* pool = [NSAutoreleasePool new]; 
// Your code goes here 
[pool drain]; 

Кроме того, имейте в виду, что если вы зацикливание внутри нового/дренажного блока NSAutoreleasePool, вы окажетесь просачиваться, пока вы не попали в канализацию. Результатом этого является то, что если вы выделяете слишком много памяти внутри цикла, ваше приложение может по-прежнему исчерпать память. В этом случае вам может потребоваться создать и слить второй NSAutoreleasePool каждый раз через цикл (или, возможно, каждый n-й раз через цикл, чтобы избежать некоторых из служебных данных).

+0

+1 для комментария Марка. Я часто вижу код в записи потока, который создает пул автозапуска и не сбрасывает его до тех пор, пока поток не выйдет. Для долговечной нити или даже короткой, которая выделяет много памяти (например, изображений), вам нужно часто сливать и воссоздавать пул. – par

1

Вы используете этот код для вторичной резьбы? Если бы вы установили пул автозапуска при входе?

+0

Нет ничего в главной теме. Я использую NSOperationQueue для многопоточности, который, как мне кажется, заботится о самом NSAutorelease. Если я использовал NSThread непосредственно в каком-то другом потоке, мне пришлось создать пул автозапуска для этой конкретной темы. правильно..? исправьте меня, если я ошибаюсь. –

+0

вы можете попробовать обернуть NSAutoreleasePool над этой функцией и посмотреть, устранит ли она проблему. AutoreleasePool-leak обычно возникает, когда вы пытаетесь выполнить метод в фоновом режиме, у которого нет AutoreleasePool –

+0

Да, вы должны создать пул автозапуска в своей основной работе. См. Http://stackoverflow.com/questions/184409/nsautoreleasepool-in-nsoperation-main – par