очистить кеш и память после использования NSdata для загрузки PDF - PullRequest
0 голосов
/ 01 июля 2011

Как мне очистить данные кеша и другую память при использовании этого кода? CFData (магазин) на симуляторе продолжает расти ....

-(void)downloadFile:(NSURL *)theURL
{
    NSLog(@"dowbload this url : %@",theURL);

    NSURL *url = theURL;

    NSData *data = [NSData dataWithContentsOfURL:url];

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    NSString *documentsDirectory = [paths objectAtIndex:0];

    NSString *pdfPath = [documentsDirectory stringByAppendingPathComponent:@"PDF2.pdf"];

    [data writeToFile:pdfPath atomically:YES];

    [self showThePDF];
    NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil];
    [NSURLCache setSharedURLCache:sharedCache];
    [sharedCache removeAllCachedResponses];
    [sharedCache release];
}

Ответы [ 3 ]

1 голос
/ 01 июля 2011

У меня недавно была похожая проблема с этим.

По существу dataWithContentsOfURL использует NSURLConnection под капотом, который кеширует ответ.

Я бы порекомендовал пару вещей:

Используйте NSURLConnection самостоятельно, чтобы получить данные вместо dataWithContentsOfURL.

Используйте асинхронный API NSURLConnection и методы делегата (редко нужны методы синхронизации).

Реализация метода делегата NSURLConnectionниже и верните nil в нем:

- (NSCachedURLResponse *)connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse
{
    return nil;
}

Это гарантирует, что ответы не будут кэшированы.

Документация NSURLConnection: http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/Reference/Reference.html

Использование NSURLConnection: http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/URLLoadingSystem/Tasks/UsingNSURLConnection.html

0 голосов
/ 03 июня 2014

Используйте этот код.

У меня такая же проблема с dataWithContentsOfURL.Попробуйте добавить @autorealse:

            @autoreleasepool {
            NSError *error = nil;
            NSData *data=[[NSData alloc] init];
            data = [NSData dataWithContentsOfURL:url options:NSDataReadingUncached error:&error];
            img = [UIImage imageWithData:data];
            }
0 голосов
/ 01 июля 2011

Вам необходимо освободить переменные: data , paths и pdfPath . Следующие звонки:

   [NSData dataWithContentsOfURL:url]

   NSSearchPathForDirectoriesInDomains

   [documentsDirectory stringByAppendingPathComponent:@"DPR2.pdf"]

все возвращаемые собственные объекты, которые необходимо освободить, чтобы избежать утечек памяти. Вы сами не вызывали init для них, но их внутренние реализации выделяли память от вашего имени, а затем оставляли эту память (поэтому вы можете использовать эти переменные, не беспокоясь о сбое сегментации). Даже если ваши переменные выходят из области видимости, когда метод возвращается, выделенная ими память сохраняется, потому что вы не уменьшили ее счетчик ссылок с помощью release . Я показываю примерно измененный код, прежде чем он должен работать:

-(void)downloadFile:(NSURL *)theURL 
{ 
    NSLog(@"dowbload this url : %@",theURL); 

    NSURL *url = theURL; 

    NSData *data = [NSData dataWithContentsOfURL:url]; 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 

    NSString *documentsDirectory = [paths objectAtIndex:0]; 

    NSString *pdfPath = [documentsDirectory stringByAppendingPathComponent:@"DPR2.pdf"]; 

    [data writeToFile:pdfPath atomically:YES]; 

    [self showThePDF]; 
    NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil]; 
    [NSURLCache setSharedURLCache:sharedCache]; 
    [sharedCache removeAllCachedResponses]; 
    [sharedCache release];

    [pdfPath release];
    [paths release];
    [data release];
}

При желании вы можете управлять динамически размещенными переменными в NSAutoReleasePool .

...