我有一个自定义单元格,它有两个UILabel对象。
//AppEventCell.h
#import <UIKit/UIKit.h>
@interface AppEventCell : UITableViewCell
{
UILabel * titleLabel;
UILabel * periodLabel;
}
@property (nonatomic, retain) UILabel * titleLabel;
@property (nonatomic, retain) UILabel * periodLabel;
@end
//AppEventCell.m
#import "AppEventCell.h"
@implementation AppEventCell
@synthesize titleLabel, periodLabel;
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 13, 275, 15)];
[self.contentView addSubview:titleLabel];
periodLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 33, 275, 15)];
[self.contentView addSubview:periodLabel];
}
return self;
}
@end
- (AppEventCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"NoticeTableCell";
AppEventCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[AppEventCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
[cell.titleLabel setText:((NSString *)[[listArray objectAtIndex:indexPath.row] valueForKey:KEY_TITLE])];
[cell.periodLabel setText:((NSString *)[[listArray objectAtIndex:indexPath.row] valueForKey:KEY_PERIOD])];
return cell;
}
这是一个问题。我应该在哪里发布titleLabel和periodLabel?我想我应该自己释放它们。但是,AppEventCell中没有dealloc()(我创建了方法,但它从未调用过)。我将该版本放在CellForRowAtIndexPath中,但在重复使用单元格时发生错误。
我不应该释放这些物品吗?
答案 0 :(得分:1)
1)在这里,你应该在将它们添加为子视图后发布标签:
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 13, 275, 15)];
[self.contentView addSubview:titleLabel];
[titleLabel release];
periodLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 33, 275, 15)];
[self.contentView addSubview:periodLabel];
[periodLabel release];
}
return self;
}
2)应为您的单元格调用dealloc
方法。它没有被调用是错误的。检查您是否正在发布tableView
并且在- (AppEventCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
中是另一个内存泄漏:
cell = [[[AppEventCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
将新cell
标记为autoreleased
对象。
3)如果重复使用单元格([tableView dequeueReusableCellWithIdentifier:CellIdentifier];
),则应拨打release
或autorelease
。