【问题标题】:How to release UIImageView in UITableViewCell?如何在 UITableViewCell 中释放 UIImageView?
【发布时间】: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 拥有的对象。该版本不应出现异常。如果您遇到异常,则代码中的保留/释放平衡有问题。

标签: objective-c cocoa-touch uitableview uiimageview


【解决方案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]; } }
    猜你喜欢
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多