gpt4 book ai didi

ios - 内存泄漏从服务器下载图像

转载 作者:行者123 更新时间:2023-11-29 13:17:48 24 4
gpt4 key购买 nike

我有一个分页 slider View ,每页都有一个图像。我正在使用 NSOperationQueue 帮助我在程序运行时从服务器下载图像。 NSOperationQueue 用于调用以下方法,

-(NSData *)imageWith:(NSString *)imageName
{

NSString *imagePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:imageName];
NSData *imageData = [NSData dataWithContentsOfFile:imagePath];

if (!imageData) {

imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:[[NSString stringWithFormat:@"%@/%@", picsURL,imageName] stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]]];

if (imageData) {

[imageData writeToFile:imagePath atomically:YES];
}
}
return imageData;
}

然后我使用主线程在 ScrollView 上显示下载的图像:

[self performSelectorOnMainThread:@selector(loadPic:) withObject:[NSArray arrayWithObjects:[self imageWith:[picsNames objectAtIndex:imageView.tag]], [NSString stringWithFormat:@"%d", imageView.tag], nil] waitUntilDone:YES];

调用以下方法:

-(void)loadPic:(NSArray *)imageAndTagArray
{
if (imageAndTagArray.count) {

//loading the image to imageview
UIImageView *imageView = (UIImageView *)[scrollView viewWithTag:[[imageAndTagArray objectAtIndex:1] intValue]];
imageView.image = [UIImage imageWithData:((NSData *)[imageAndTagArray objectAtIndex:0])];

//stopping the indicator
[((UIActivityIndicatorView *)[imageView viewWithTag:ACTIVITY_INDICATOR_TAG]) stopAnimating];
}
}

前 60 张图像一切正常,但之后我收到内存警告,大约 100 张图像后应用程序崩溃。

我在这上面花了很多时间,但我不知道该怎么做。我用过 Instruments,它没有检测到任何泄漏。我也使用过 Analyze,它也确实显示了任何内容。

编辑:

如果我用以下定义替换 imageWith: 方法定义,我仍然会收到警告,其中 5.jpg 是本地镜像。

-(NSData *)imageWith:(NSString *)imageName
{
return UIImagePNGRepresentation([UIImage imageNamed:@"5.jpg"]);
}

让我告诉你更多的情况。

当应用程序启动时,我有一个 View ,其中包含一个分页 ScrollView ,每页包含 9 个图像。 ScrollView 使用 nsoperationqueue 加载调用 imageWith: 方法的图像。

当用户点击任何图像时,第二个 View 将打开,并完整显示所选图像。第二个 View 还有一个 ScrollView ,其中包含与第一个 View 相同的图像,但具有完整显示,这意味着每页 1 个图像。

当您在第二个 View 上来回滚动时,应用程序会在加载大约 60 张图像后崩溃。如果说它加载了 50 张图片,然后你点击后退按钮并转到第一个 View ,然后点击另一张图片并转到第二个 View 并加载大约 10 张图片,它也会崩溃。

最佳答案

听起来您的内存中保存了太多图像。当您打开第二个 View 时,它会再次从磁盘重新加载图像,直到您得到所有​​图像的两个副本。

UIImage 类或许可以帮助您进行内存管理。在其reference page ,它提到它有能力在内存不足的情况下清除其数据,然后在需要再次绘制时从磁盘重新加载文件。这可能是您的解决方案。

但是,当您从从磁盘读取的 NSData 创建图像时,UIImage 可能无法清除其内存 - 它不知道您的图像只是存储在磁盘上,所以它可以'不要丢弃数据并稍后重新加载。

尝试更改您的“imageWith”方法以在它返回之前从磁盘上的文件 URL 创建一个 UIImage(通过 imageWithContentsOfFile),并返回 UIImage 而不是返回中间 NSData。这样,UIImage 将知道其图像源在磁盘上的位置,并能够在设备内存受限时智能地清除/重新加载它。

关于ios - 内存泄漏从服务器下载图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15232150/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com