4

以下代码从不同大小的服务器下载 700 多个图像,这里的问题是内存(即使使用 ARC)永远不会释放,最终会出现内存警告,然后应用程序退出。我在这种方法中尝试过@autoreleasepool,但似乎没有用。此外,我尝试在不同位置停止 for 循环,以查看内存是否在完成后释放,但事实并非如此。

此方法在 for 循环中调用并接收图像 url 和短名称。它已经在后台线程和主线程中进行了尝试,结果相同(内存方面)。

-(void)saveImage:(NSString*)image name:(NSString*)imageName{     
    int k = 0;
    for (int j = 0; j < [imageName length]; j++) {
        if ([imageName characterAtIndex:j] == '/') {
            k = j;
        }
    }if (k != 0) {
        imageName = [imageName substringFromIndex:k+1];
    }    

    NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@", imageName]]; 

    if ([fileManager fileExistsAtPath:fullPath]) {
        [fileManager removeItemAtPath:fullPath error:nil];
    }

    NSURL *url = [NSURL URLWithString:image];
    NSData *data = [[NSData alloc]initWithContentsOfURL:url];
    NSLog(@"Saved: %d:%@", [fileManager createFileAtPath:fullPath contents:data attributes:nil], url); 
    data = nil;
}  


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

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];

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
self.window.rootViewController = self.viewController;
[[UIApplication sharedApplication] setStatusBarHidden:YES];
[self.window makeKeyAndVisible];
return YES;
}

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {
NSLog(@"mem warning, clearing cache");
[[NSURLCache sharedURLCache] removeAllCachedResponses];
}

分配

4

2 回答 2

5

根据您的屏幕截图,我认为问题在于 NSURL 缓存而不是实际的 NSData 对象。您可以尝试以下方法:

在您的应用程序委托中,设置初始 URL 缓存:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Do initial setup
    int cacheSizeMemory = 16*1024*1024; // 16MB
    int cacheSizeDisk = 32*1024*1024; // 32MB
    NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:cacheSizeMemory diskCapacity:cacheSizeDisk diskPath:@"nsurlcache"];
    [NSURLCache setSharedURLCache:sharedCache];

    // Finish the rest of your didFinishLaunchingWithOptions and head into the app proper
}

将以下内容添加到您的应用程序委托中:

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {
    [[NSURLCache sharedURLCache] removeAllCachedResponses];
}

将创建一个缓存文件:"Library/Caches/your_app_id/nsurlcache"

Apple 示例的链接在这里:URL Cache

代码未经测试,但这个(或类似的)应该对你的问题进行排序+加上你可以试验缓存大小。

您可以使用此代码发布另一个分配的屏幕截图吗?我希望看到内存使用停止增长并趋于平缓。

于 2012-07-06T16:35:59.480 回答
1

" dataWithContentsOfURL" 返回一个自动释放的 NSData 对象,它通常在运行循环结束或方法结束时才会被释放,所以难怪你很快就会填满内存。

将其更改为显式的“ initWithContentsOfURL”方法,然后在您完全完成图像数据时通过执行“ ”强制释放。data = nil;

于 2012-07-05T19:19:07.287 回答