1

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

我的应用程序使用了大量来自 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”和一个 collectionview,因为我释放了每张图片,当我在 collectionview 中滚动时我的应用程序崩溃...

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

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

4

1 回答 1

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 中没有这样的 URL,它将在磁盘上搜索该 URL 的保存图像,如果失败,它将开始下载和缓存您的图像。因此,当您收到内存警告时,您SDImageCache只能使用调用。clearMemory

于 2012-10-24T21:03:58.060 回答