如何在 UITableViewCell 中释放 UIImageView?

Posted

技术标签:

【中文标题】如何在 UITableViewCell 中释放 UIImageView?【英文标题】:How to release UIImageView in UITableViewCell? 【发布时间】:2011-11-24 15:52:17 【问题描述】:

我在 TableViewCell 中有 UIImage 插座,稍后我将在 UITableView 中使用它。当我在仪器中检查这个时,我在 UIImageView 上发现了一些内存泄漏。我没有在 UITableViewCell 中释放 UIImageView,因为如果我在 tavleViewCell 中释放它,我会得到 exc_bad_access。

我的问题是我在哪里发布这个 UIImageView?

更新

CustomCell.h

@interface CustomCell : UITableViewCell 
IBOutlet UIImageView *customImage;


@property(nonatomic, retain) UIImageView *customImage;

@end

CustomViewController.m

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

static NSString *CellIdentifier = @"CustomCell";
CustomCell *cell = (CustomCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

cell.customImage.hidden = [[self.customImageList objectAtIndex:indexPath.row] boolValue];

return cell; 

【问题讨论】:

据我了解,您使用的是 UITableViewCell 子类。您应该对它的代码进行 pst,包括接口定义。 您应该在 cell 的 dealloc 中释放 cell 拥有的对象。该版本不应出现异常。如果您遇到异常,则代码中的保留/释放平衡有问题。 【参考方案1】:

UITableView 缓存单元格供以后重用。这显示为内存泄漏,但您最终可以重用该单元,因此它不会真正泄漏。

您可以做的是在单元格滚动离开屏幕时释放自定义 UITableViewCell 保留的图像视图,但如果在滚动时再次需要图像,这可能会导致性能问题。

【讨论】:

我想这解释了这个问题。谢谢,我会保持原样。 只要你不给我们更多信息,这个答案只是一个假设。 我确实在我自己的应用程序中追踪了明显的内存泄漏,只是发现我的 UITableViewCells 上唯一剩余的保留来自 UITableView,并且即使在它们滚动离开屏幕后它也保留了单元格并且不再可见。但是,是的,这只是一个假设,这就是 OP 正在发生的事情。【参考方案2】:

首先,让我们定义一下您的意思。当我们谈论真正的内存泄漏时,就是堆已分配但在代码中的任何位置都不再有任何指向它的指针。真的是泄露了,丢失了,不能再使用了。如果 Leaks 工具将其识别为泄漏,则意味着它是这种泄漏,这不是可以忍受的东西,也不是某些人建议的虚假泄漏。

如果您在 Leaks 工具中没有看到它,那么它仍然可能是泄漏,或者可能是另一种类型的内存问题,有些人也将其称为内存泄漏,例如废弃的内存。

无论如何,请让我们知道是什么让您称其为泄漏,您需要发布您的代码以获得更多帮助。

【讨论】:

【参考方案3】:

尝试将其设置为 nil 即在 dealloc 中:

self.imageViewName = nil;

【讨论】:

好的,那么是时候分享一些代码了,这样我们就知道你在说什么了,因为它听起来很直接 你不应该在 dealloc 中引用 self。而不是 self.imageViewName = nil 使用 [imageViewName release]; imageViewName = nil; 不正确,如果您合成了您的属性,这是常见的做法。通过综合属性创建的 setter 将负责释放该属性。即@property (nonatomic, retain) NSDate *timestamp; 将产生以下设置器- (void)setTimestamp:(NSDate *)newValue if (timestamp != newValue) [timestamp release]; timestamp = [newValue retain];

以上是关于如何在 UITableViewCell 中释放 UIImageView?的主要内容,如果未能解决你的问题,请参考以下文章

UIbutton 在自定义 UITableViewCell 中释放

后退按钮后未释放 UITableViewCell 的 UIImage 的内存

如何在 iPhone (iOS 5) 上的音乐应用程序中为 UITableViewCell 创建一个弹出窗口

不再使用时从 UITableViewCell 中删除观察者

如何借助 AutoLayout 在自定义 UITableviewCell 中添加自定义 UIView(xib)?

如何在其中使用UIStackView自定义UITableViewCell的大小