Где я должен выпустить настроенные объекты ячеек? - PullRequest
0 голосов
/ 05 марта 2012

У меня есть пользовательская ячейка с двумя объектами 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 Ответ

1 голос
/ 05 марта 2012

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...