Итак, у меня проблема с памятью в моем приложении. Приложение имеет MKMapView с MKOverlayRenderer, который загружает изображения на карту. Все работает нормально, но через 30-60 минут приложение вылетает из-за памяти.
С инструментами я обнаружил, что NSURLConnection растет, и, поскольку я не могу найти ничего другого (кроме всего, что я не понимаю), я думаю, что это моя проблема.
Скриншот инструментов после запуска в течение 1-2 минут:
Скриншот приборов после 12-13 минут работы:
Изображения загружаются таким образом в методе canDrawMapRect и сохраняются в папку tmp (если я отключу это, NSURLConnection не будет расти так высоко):
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
[NSURLConnection sendAsynchronousRequest:request
queue:[OperationQueues sharedOperationQueue]
completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
[data writeToFile:path atomically:YES];
Затем загружается в метод drawMapRect.
Я попытался исправить это с помощью следующего кода:
AppDelegate:
int cacheSizeMemory = 4*1024*1024; // 4MB
int cacheSizeDisk = 32*1024*1024; // 32MB
NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:cacheSizeMemory diskCapacity:cacheSizeDisk diskPath:@"nsurlcache"];
[NSURLCache setSharedURLCache:sharedCache];
NSURLCache *URLCache = [[NSURLCache alloc] initWithMemoryCapacity:cacheSizeMemory
diskCapacity:cacheSizeDisk
diskPath:nil];
[NSURLCache setSharedURLCache:URLCache];
Вьюконтроллер:
- (void)didReceiveMemoryWarning
{
[[NSURLCache sharedURLCache] removeAllCachedResponses];
[super didReceiveMemoryWarning];
}
сразу после запроса: [добавлено]
[[NSURLCache sharedURLCache] removeCachedResponseForRequest:request];
Но, как вы можете видеть в Инструментах, безуспешно.
- Может ли это быть моей проблемой?
- Это NSURLCache, который растет, или что-то еще?
По просьбе еще пара скринов с приборов:
+[NSURLConnection _resourceLoadLoop]
? - person thelaws   schedule 23.12.2014NSURLCache
? - person thelaws   schedule 23.12.2014canDrawMapRect
? Чтобы действительно протестироватьNSURLCache
, вы должны установить cacheSize равным 0. (Кроме того, в вашем фрагменте кода вам нужно толькоsetSharedURLCache
один раз) - person thelaws   schedule 23.12.2014