UITableViewCell dealloc方法

时间:2013-05-08 09:00:26

标签: iphone ios objective-c

我的应用中有UITableViewCell

@interface ResultCell : UITableViewCell {
IBOutlet UILabel *name;
IBOutlet UILabel *views;
IBOutlet UILabel *time;
IBOutlet UILabel *rating;
IBOutlet UILabel *artist;

IBOutlet UIImageView *img;
}

@property (nonatomic, retain) UILabel *name;
@property (nonatomic, retain) UILabel *views;
@property (nonatomic, retain) UILabel *time;
@property (nonatomic, retain) UILabel *rating;
@property (nonatomic, retain) UILabel *artist;

@property (nonatomic, retain) UIImageView *img;

@end

所有这些IBOutlet都在Xib文件中连接到UILabel ....

这是我创建每个单元格的方式:

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

if (cell == nil){
    UIViewController *vc = [[[UIViewController alloc] initWithNibName:@"ResultCell" bundle:nil] autorelease];
        cell = (ResultCell *) vc.view;
}

cell.name.text = item.name;
cell.views.text = item.viewCount;
cell.rating.text = [NSString stringWithFormat:@"%d%%",item.rating];
cell.time.text = item.timeStr;
cell.artist.text = item.artist;

我想知道在ResultCell类中我是否需要实现一个dealoc方法并释放UILabel?或者它像我做的一样好吗?我正在使用非ARC,因为它是一个旧项目。

5 个答案:

答案 0 :(得分:2)

是的,必须释放每个保留的属性或实例变量,并且IBOutlet也不例外。因为您使用属性,所以最好的方法是:

-(void)dealloc {
    self.name = nil;
    self.views = nil;
    //... and so on
    [super dealloc];
}

顺便说一句,您不需要为您的属性声明“冗余”实例变量,如下所示:

IBOutlet UILabel *name;

很久以前需要它(在XCode 3时代的AFAIR),但现在编译器会自动为每个声明的属性生成它们。

答案 1 :(得分:0)

如果需要,您可以将自定义表格视图单元格中的所有标签设置为保留,您必须在dealloc方法中释放它并在viewDidUnload中指定nil。它可以避免内存泄漏。

答案 2 :(得分:0)

是的,您必须在dealloc类中编写ResultCell方法以释放您合成的对象以避免内存泄漏。有关更多信息,请参阅链接http://www.raywenderlich.com/4723/how-to-make-an-interface-with-horizontal-tables-like-the-pulse-news-app-part-2

答案 3 :(得分:0)

  1. 您将UIView类型转换为ResultCell,而不是使用单元格标识符创建UITableViewCell实例。
  2. dequeueReusableCellWithIdentifier:将始终返回nil,从而创建大量UIViewController个实体
  3. 由于您正在返回UIViewController的视图,因此内存管理将变得棘手。您还需要在表视图释放单元格后释放视图控制器实例。这将需要存储所有vc实例并在以后释放它们。目前,所有vc实例都会导致内存泄漏。
  4. 为避免这些不必要的并发症,您需要遵循标准技术。话虽这么说,您需要为单元格创建单独的XIB和类文件,使用UINib从xib加载表格视图单元格。请参阅此tutorial

    干杯!
    阿玛尔

答案 4 :(得分:-1)

使用像

这样的东西
ResultCell *containerView = [[[NSBundle mainBundle] loadNibNamed:@"ResultCell"  owner:self    options:nil] lastObject];

而不是

UIViewController *vc = [[[UIViewController alloc] initWithNibName:@"ResultCell" bundle:nil] autorelease];

确保您将ResultCell.xib文件的所有者设为ResultCell课程。

,因为UILabelUIImageView属于retained属性,它们将以dealloc ResultCell方法发布}。class。