使用SDWebimagemanager iOS iPhone记忆清楚

时间:2012-10-24 20:45:14

标签: iphone ios memory memory-leaks sdwebimage

我非常失望,因为我有这个记忆问题已经过了一个星期,我找不到解决方案。

我的应用程序使用了很多来自Facebook的高分辨率照片。

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

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

如您所想,我必须经常为我的控制器的每个实例清除Cache。

但是,我有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清除内存缓存时没有任何反应。

这很奇怪,因为如果我在这一行之后放了一个[图像发布]:

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

当我打电话给SDImagecache时,我的记忆被清除了,但你可以想象......如果我这样做...... 我刚刚使用这个词典“photosload”和一个collectionview,因为当我在collectionview中滚动时,我释放了每个图像,我的应用程序崩溃...

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

非常感谢你的帮助,我完全陷入了这个记忆问题

1 个答案:

答案 0 :(得分:0)

如果我错了,请纠正我,但我认为您的问题在于下载所有项目,即使是那些您目前不需要的项目。您是否同时在屏幕上显示了所有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,然后如果在memcache中没有此类网址,则会搜索磁盘以获取此网址的已保存图片如果失败,它将开始下载并缓存您的图像。因此,当您收到内存警告时,您必须仅使用SDImageCache来呼叫clearMemory