我有一个系统,从Web加载许多大图像并在自定义表格单元格中显示它们。在旧设备上,内存警告很快发生,因此我实现了一个删除表格中某些内容的系统来尝试解决这个问题,但效果不佳(删除了许多图像影响了UI)。
所以我想把所有图像都加载到设备的缓存中,然后再从缓存中加载它们 - 我已经实现了SDWebImage。这很不错,但我仍然没有解决内存分配问题,因为图像仍然一直显示着,因此保留在内存中会导致崩溃。
我认为我需要实现一个系统,如果正在显示单元格,则显示来自缓存的图像,并在单元格未显示时隐藏它 - 我只是不知道如何构建这样一个系统。
或者这不会起作用吗?通过删除其表格单元格中的图像,您真的可以保持应用程序的内存较低(并避免其出现内存警告/崩溃)吗?还是我只需要继续使用先前的解决方案,并删除图像/单元格,直到内存警告停止? 附带代码更新
所以我想把所有图像都加载到设备的缓存中,然后再从缓存中加载它们 - 我已经实现了SDWebImage。这很不错,但我仍然没有解决内存分配问题,因为图像仍然一直显示着,因此保留在内存中会导致崩溃。
我认为我需要实现一个系统,如果正在显示单元格,则显示来自缓存的图像,并在单元格未显示时隐藏它 - 我只是不知道如何构建这样一个系统。
或者这不会起作用吗?通过删除其表格单元格中的图像,您真的可以保持应用程序的内存较低(并避免其出现内存警告/崩溃)吗?还是我只需要继续使用先前的解决方案,并删除图像/单元格,直到内存警告停止? 附带代码更新
TableViewController.m
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.section == 0)
{
currentIndexPath = indexPath;
ImageTableCell *cell = (ImageTableCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
ImageDownloader *download = [totalDownloads objectAtIndex:[indexPath row]];
if (cell == nil)
{
cell = [[[ImageTableCell alloc] initWithStyle: UITableViewCellStyleDefault reuseIdentifier: CellIdentifier] autorelease];
}
cell.imageView.image = download.image;
return cell;
}
return nil;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
int t = [totalDownloads count];
return t;
}
ImageTableCell.m - 自定义单元格
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self)
{
self.frame = CGRectMake(0.0f, 0.0f, 320.0f, 0.0f);
self.contentView.frame = CGRectMake(0.0f, 0.0f, 320.0f, 0.0f);
self.autoresizingMask = (UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth);
self.contentMode = UIViewContentModeScaleToFill;
self.autoresizesSubviews = YES;
self.contentView.autoresizingMask = (UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth);
self.contentView.contentMode = UIViewContentModeScaleToFill;
self.contentView.autoresizesSubviews = YES;
[self.imageView drawRect:CGRectMake(0.0f, 0.0f, 320.0f, 0.0f)];
self.imageView.contentMode = UIViewContentModeScaleAspectFill;
self.imageView.autoresizingMask = (UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth);
self.imageView.opaque = YES;
}
return self;
}
ImageDownloader (实现SDWebImageManagerDelegate)
-(void) downloadImage // Comes from Model class
{
if (image == nil)
{
NSURL *url = [NSURL URLWithString:self.urlString];
SDWebImageManager *manager = [SDWebImageManager sharedManager];
// Remove in progress downloader from queue
[manager cancelForDelegate:self];
if (url)
{
[manager downloadWithURL:url delegate:self retryFailed:YES];
}
}
}
- (void)cancelCurrentImageLoad
{
[[SDWebImageManager sharedManager] cancelForDelegate:self];
}
- (void)webImageManager:(SDWebImageManager *)imageManager didFinishWithImage:(UIImage *)_image
{
self.image = _image;
if ([self.delegate respondsToSelector:@selector(addImageToModel:)]) [self.delegate addImageToModel:self];
}
- (void)webImageManager:(SDWebImageManager *)imageManager didFailWithError:(NSError *)error;
{
if ([self.delegate respondsToSelector:@selector(badImage)]) [self.delegate badImage];
}
cellForRowAtIndexPath
方法? - Ilanchezhian