gpt4 book ai didi

ios - 在 UITableView 中显示大图像的内存问题

转载 作者:可可西里 更新时间:2023-11-01 03:31:27 26 4
gpt4 key购买 nike

我有一个系统可以从网络加载大量大图像并将它们显示在自定义表格单元格中。在旧设备上,内存警告发生得非常快,所以我实现了一个系统,从表中删除一些以尝试解决这个问题,但它效果不佳(很多图像被删除影响了 UI)。

所以我想我可以将所有图像加载到设备的缓存中,然后从那里加载它们 - 我已经实现了 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];
}

最佳答案

下载图像后,不要将大图像保存在内存中。只需创建一个小尺寸的图像(缩略图)以显示在 tableview 中,并将较大的图像写入某个目录。

您可以使用以下代码创建图像的缩略图。

            CGSize size = CGSizeMake(32, 32);
UIGraphicsBeginImageContext(size);
[yourImage drawInRect:CGRectMake(0, 0, 32, 32)];
yourImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

关于ios - 在 UITableView 中显示大图像的内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6843430/

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