我的应用中有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,因为它是一个旧项目。
答案 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)
UIView
类型转换为ResultCell
,而不是使用单元格标识符创建UITableViewCell
实例。 dequeueReusableCellWithIdentifier:
将始终返回nil
,从而创建大量UIViewController
个实体UIViewController
的视图,因此内存管理将变得棘手。您还需要在表视图释放单元格后释放视图控制器实例。这将需要存储所有vc实例并在以后释放它们。目前,所有vc实例都会导致内存泄漏。
为避免这些不必要的并发症,您需要遵循标准技术。话虽这么说,您需要为单元格创建单独的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
课程。
是,因为UILabel
和UIImageView
属于retained
属性,它们将以dealloc
ResultCell
方法发布}。class。