【问题标题】:Memory clear with SDWebimagemanager iOS iPhone使用 SDWebimagemanager iOS iPhone 清除内存
【发布时间】:2012-10-14 23:29:12
【问题描述】:

我很失望,我有这个记忆问题已经一个多星期了,我找不到解决办法。

我的应用使用了大量来自 facebook 的高分辨率照片。

我使用 SDwebimageManager 下载和缓存我的所有照片。

当我创建我的 photoviewcontroller 实例时,平均有 40 张照片被下载和缓存并出现在屏幕上。

正如你想象的那样,我必须经常为我的控制器的每个实例清除缓存。

但是,我的 SDWebimage 有问题,我无法清除缓存...可用物理内存的大小正在下降,我的应用程序总是很快崩溃

我正在使用情节提要创建这样的控制器(如您所见,我首先清除缓存):

if([[segue identifier] isEqualToString:@"FriendView"])
{
    SDImageCache *imageCache = [SDImageCache sharedImageCache];
    [imageCache clearMemory];
    if (self.friends != nil) {
        [self.friends release];
    }
    NSString *s = [friendsid objectAtIndex:indexload];

    self.friends = (MyFriendViewController *)[segue destinationViewController];

    self.friends.friend = s;
    self.friends.Manager = self.Manager; 
}

在控制器中,我使用我的管理器下载每张这样的照片:

for(int i=0;i<items.count;i++) {
   [self.Manager downloadWithURL:[NSURL URLWithString:[self.items objectAtIndex:i]]
   delegate:self
   options:0
   success:^(UIImage *image,BOOL cached )                        
   {
       [self.photosload setObject:image  forKey:[NSString stringWithFormat:@"%i", i]];
       if (photosload.count == items.count) {
           [self.collectionView reloadData];
       }
   }
   failure:nil];
}

我使用 NSDictionary 来收集我所有的照片,当最后一张照片被下载时, 我重新加载我的收藏视图。 如果我返回我的 ui 并重新加载我的控制器,我的内存会增长并且我很快就会收到警告......并且应用程序崩溃了。

当我使用 SDCache 清除内存缓存时没有任何反应。

这很奇怪,因为如果我在这行后面放一个 [image release] :

[self.photosload setObject:image  forKey:[NSString stringWithFormat:@"%i", i]];
[image release];

当我调用 SDImagecache 时,我的内存被清除了,但你可以想象......如果我这样做...... 我将这本字典“photosload”与一个集合视图一起使用,因为当我在集合视图中滚动时,我释放了我的应用程序崩溃的每张图像......

我很失望,我不知道发生了什么......

非常感谢您的帮助,我完全被这个内存问题所困扰

【问题讨论】:

    标签: iphone ios memory memory-leaks sdwebimage


    【解决方案1】:

    如果我错了,请纠正我,但我认为您的问题在于下载所有项目,即使是您目前不需要的项目。您的屏幕上是否同时显示所有 40 张图像?我认为您有一个集合视图,同时屏幕上只有几个。

    因此,如果我是对的,您不必循环下载所有这些,仅在需要时下载它们,最常见的情况是当您显示新图像时。您将重用 UIImageView 并用新的 URL 填充它。如果您使用的是SDImage 库,那么您必须像这样加载图像:

    [imageView setImageWithURL:[NSURL URLWithString:self.items objectAtIndex:i]]
              placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
    

    它应该会自动缓存您的图像。当您收到内存警告时,您应该清除缓存,但这不是问题。

    SDImage 是这样工作的:

    当您调用 [imageView setImageWithURL:URL placeholderImage:Image]; 时,它会检查 memcache,它只是 NSDictionary,然后如果内存缓存中没有这样的 URL,它将在磁盘上搜索该 URL 的已保存图像,如果失败,它将开始下载和缓存您的图像。所以,当你收到内存警告时,你只能使用SDImageCache 来调用clearMemory

    【讨论】:

    • 谢谢你的回复,我会试试你的想法,我不需要同时 40 张图片,但我在重新加载 CollectionView 之前下载了图片,因为如果我滚动(加载照片是异步的,并且随机),我看到空单元格在它们成为图像之前太久了。当用户滚动时我想要一个完美的用户体验,我更喜欢没有内存警告.. 不可能像我在我的示例中所做的那样在内存警告之前清除缓存?
    • 试试吧,当你做setImageWithURL 它会取消之前的请求,如果它正在进行中,所以它应该需要更多的时间。而且我之前一直在使用这个库,它对我来说很好。
    • 嗯,你知道的,你甚至不必调用clearMemory,因为SDImageCacheUIApplicationDidReceiveMemoryWarningNotification 的观察者,所以它会自动清除内存。
    • 好的,我试试,我会很快给你答复非常感谢!
    • 我发现的另一件事是,如果您想减小内存缓存的大小,只需将您自己的号码放入 SDImageCache 而不是 static natural_t minFreeMemLeft = 1024*1024*12; // reserve 12MB RAM
    猜你喜欢
    • 1970-01-01
    • 2011-07-09
    • 2021-01-13
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    • 2016-03-17
    • 2013-02-02
    • 2015-05-26
    相关资源
    最近更新 更多