2009-08-08 2 views
5

памяти проблему утечки - NSConcreteDataпамяти с помощью NSData в iPhone

// to set tip - photo in photo frame  
NSData *data=[NSData dataWithContentsOfURL:[NSURL URLWithString:pathOfThumbNail]]; 
UIImage *cellThumbImg; 
if([data length]>0){ cellThumbImg=[UIImage imageWithData:data];} else { cellThumbImg=[UIImage imageNamed:@"130X90.gif"]; } 
UIImageView *imgView=[[UIImageView alloc]initWithImage:cellThumbImg]; imgView.frame=photoFrame; 
(cellThumbImg.size.height>=58 || cellThumbImg.size.width>=58) ? [imgView setContentMode:UIViewContentModeScaleToFill] : [imgView setContentMode:UIViewContentModeCenter] ; 
[cell.contentView addSubview:imgView]; 
[imgView release]; 

мой вопрос очень похож на этот вопрос,

iPhone - Memory Leak - NSData dataWithContentsOfUrl & UIWebView

Даже, я добавил следующий код к Заявление закончилось Запуск, приведенный ниже. Следующий код предназначен для установки памяти sharedCache с нулевой емкостью. Он почти удалит утечку NSConcreteData в моем приложении. Однако утечка памяти.

- (void)applicationDidFinishLaunching:(UIApplication *)application {  
NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil]; 
[NSURLCache setSharedURLCache:sharedCache]; 
[sharedCache release]; 
[window makeKeyAndVisible]; 
} 

Я не мог найти решения для этого вопроса из переполнения стека.

Если вы можете ответить, я буду благодарен вам.

Заранее спасибо.

+0

Я пошел по пути как @Bkaenk & @epatelsaid. Однако есть та же проблема, что и следующий вопрос. http://stackoverflow.com/questions/280053/iphone-memory-leak-nsdata-datawithcontentsofurl-uiwebview –

ответ

7

У меня были проблемы с этим, а также в моем большом проекте. После работы с инженером Apple, пытаясь найти утечки, он, наконец, спросил основную команду Apple dev за NSURLConnection. В основном они сказали, что внутри NSURLConnection есть внутренний кеш, который не совсем понятен, и это была известная проблема.

Итак, я отправился на поиски альтернатив. Я нашел ASIHTTPConnection (ссылка ниже), которая работает вне CFNetwork. Он предназначен для замены на NSURLConnection, плюс множество других потрясающих лакомств, таких как загрузка на диск вместо памяти, возобновление загрузки, обратные вызовы в режиме выполнения и т. Д.

Я использовал его во всех своих проектах и ​​никогда не имел никаких проблем или жалоб. An, отвечая на ваш вопрос, так я избавился от этих утечек памяти.

http://allseeing-i.com/ASIHTTPRequest/

+1

Хотя это принятый ответ и, вероятно, решил проблему OP, я не обратил внимания на более простое решение в ответе epatel. Его ответ должен быть принят. – coneybeare

4

Ваше сообщение о нарушении написано неправильно, вы набрали relaese, но это release. Я полагаю, что это всего лишь проблема в коде, введенном для этого вопроса.

Второй. Вам не нужно первое сообщение alloc init. Все, что вам нужно:

NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"www.xyz.abc.com"]]; 

Конечно, я не знаю, что вызов на самом деле правильно, но я знаю, что он возвращает авто выпустили NSData объект означает, что ваша предыдущая alloc init просочится.

+0

@Blaenk - Сэр, пожалуйста, проверьте исправление в моем Вопросе. У меня та же проблема. Даже после применения вашей предлагаемой логики я обнаруживаю ту же проблему утечки памяти. –

10

У вас есть три линии, позволяет разбить их

1. NSData *imageData = [[NSData alloc] init]; 
2. imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"www.xyz.abc.com"]]; 
3. [imageData release]; 

Строки 1: выделить и инициализировать новый NSData. У этого NSData будет счетчик ссылок +1

Строка 2: получить данные из Интернета и разместить в NSData. Это устанавливает переменную, используемую линия 1 к новому NSData (который установлен в autorelease) скрывающую NSData alloced и inited на линии 1

Линия 3: выпустит NSData получил по линии 2.

Вы можете удалить линия 1 и 3, а просто добавить объявление переменной в строке 2. Поскольку она autoreleased будет выпускать по eventloop позже ...

NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"www.xyz.abc.com"]]; 

Я предлагаю вам прочитать УПРАВЛЕНИЕ Memory секции here

+0

@ePatel - Сэр, пожалуйста, проверьте исправление в моем Вопросе. У меня та же проблема. Даже после применения вашей предлагаемой логики я обнаруживаю ту же проблему утечки памяти. –

+0

Nit: строка 2 скрывает только что выделенную/инициализированную imageData, создавая новую. –

+0

Я, видимо, придурок, извините. Я искал это в ваших комментариях, но пропустил его и сделал плохое предположение, основанное на отредактированном вопросе .... –

7

Всякий раз, когда мы используем dataWithContentOfURL мы должны заключить его с NSAutoReleasePool, как следующее:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

// ** Your Operations ** 

NSData *data = [NSData dataWithContentsOfURL:someURL]; 

// ** Your Operation ** 

[data autorelease]; 
[pool release]; 

Это относится даже к NSURLRequest и NSURLConnection.

Проблема с самим компилятором и выше, это единственный способ решить проблему.

+1

Это ответ. Отлично. –

+0

Это абсолютно неправильно. Вы не сохранили объект с помощью каких-либо из 'keep',' alloc', 'copy',' mutableCopy' или 'new'. Вы не имеете права «авторекламы». Это неверно и приведет к сбою вашей программы где-то вниз по линии. – user102008