我应该在哪里发布定制的单元对象?

时间:2012-03-05 05:55:04

标签: objective-c uitableview

我有一个自定义单元格,它有两个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中,但在重复使用单元格时发生错误。

我不应该释放这些物品吗?

1 个答案:

答案 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];),则应拨打releaseautorelease