使用NSdata下载PDF后清除缓存和内存

时间:2011-07-01 12:45:35

标签: iphone objective-c caching nsdata

使用此代码时,如何清除缓存数据和其他内存? 模拟器上的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 个答案:

答案 0 :(得分:1)

我最近遇到了类似的问题。

本质上,dataWithContentsOfURL正在使用NSURLConnection,它会缓存响应。

我会推荐几件事:

自己使用NSURLConnection获取数据而不是dataWithContentsOfURL。

使用异步NSURLConnection API和委托方法(很少需要同步方法)。

在下面实现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

答案 1 :(得分:0)

使用此代码。

我对dataWithContentsOfURL有同样的问题。尝试添加@autorealse:

            @autoreleasepool {
            NSError *error = nil;
            NSData *data=[[NSData alloc] init];
            data = [NSData dataWithContentsOfURL:url options:NSDataReadingUncached error:&error];
            img = [UIImage imageWithData:data];
            }

答案 2 :(得分:-3)

您需要发布变量:数据路径 pdfPath 。以下电话:

   [NSData dataWithContentsOfURL:url]

   NSSearchPathForDirectoriesInDomains

   [documentsDirectory stringByAppendingPathComponent:@"DPR2.pdf"]

所有返回拥有的对象,您需要释放以避免内存泄漏。你没有亲自调用init,但是他们的内部实现代表你分配内存,然后保留这个内存(这就是你可以使用这些变量而不用担心出现分段错误的原因)。即使您的变量在方法返回时超出范围,它们分配的内存也会被保留,因为您没有通过 减少其引用计数释放 即可。我之前会显示大致修改过的代码:

-(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中管理动态分配的变量。