2012-05-20 3 views
1

У меня есть подкласс UITableViewCell, который падает, когда он попадает в строку [super dealloc]. У меня есть несколько текстовых полей в моей ячейке, и в сообщении об ошибке говорится: *** -[UITextField release]: message sent to deallocated instance 0x739dfd0Пользовательский UITableViewCell сбой на [super dealloc]

Ниже приведены соответствующие фрагменты кода (у меня есть другие текстовые поля, но все они обрабатываются одинаково). Мое подозрение заключается в том, что это связано с добавлением его в . contentView клетки Но я не знаю, как это исправить

.h файл пользовательского UITableViewCell:.

@interface ExerciseTableViewCell : UITableViewCell { 

    UITextField *textField1; 

} 

@property (nonatomic, retain) UITextField *textField1; 

@end 

.m файл:

@implementation ExerciseTableViewCell 

@synthesize textField1; 

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 
{ 
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 
    if (self) { 
     // Initialization code 

    UIView *myContentView = self.contentView; 

     UITextField *newTextField1 = [[UITextField alloc] init]; 

     self.textField1 = newTextField1; 

     [newTextField1 release]; 

     [myContentView addSubview:textField1]; 

    } 
    return self; 
} 


} 

- (void)dealloc { 
    [textField1 release]; 
    [super dealloc]; 
} 

Не могу понять, почему я слишком много раз выпускал textField?

ответ

1

что необходимость объявлять текстовое поле локально и присваивает его глобально объявленное текстовое поле, просто используйте

textField1 = [[UITextField alloc] init]; 
[myContentView addSubview:textField1]; 
+0

Это утечка. – omz

+0

О! да, спасибо, я отредактировал свой ответ – Charan

+0

Это все равно будет протекать. Когда вы назначаете сохраненное свойство, вы должны либо «autorelease», либо «освобождать» объект после этого, потому что средство настройки уже сохраняет его (то есть, если вы не используете ARC, который OP не). – omz

2

Изменения:

UITextField *newTextField1 = [[UITextField alloc] init]; 

self.textField1 = newTextField1; 

[newTextField1 release]; 

[myContentView addSubview:textField1]; 

к:

self.textField1 = [[[UITextField alloc] init] autorelease]; 
[myContextView addSubview:self.textField1]; 
+0

Должен ли я затем отпустить его и в dealloc (чтобы отменить сохранение в файле .h)? –

+0

Да, вы должны. Установка его self.textField1 вызывает сеттер, который сохраняет его, потому что вы объявили его с атрибутом сохранения, тогда вы несете ответственность за его выпуск (ваша реализация dealloc верна). Offtopic: при добавлении его в contentView, поскольку subview также сохраняет текстовое поле, но вы не несете ответственность за его управление памятью, но contentView is .. – graver

+0

... все еще не работает. Я понимаю, что вы сказали, и это имеет смысл. Здесь должно быть что-то еще. –

0

Set textfield object вместо nil вместо его выпуска. Во-вторых, во время кодирования используйте правильное соглашение об именах.

+0

Поймите это спасибо. Что касается соглашения об именах - я фактически не использовал textField1, это было просто проще, когда публикация на SO сокращала и сокращала соответствующие куски кода. –

+0

, который сработал. Тем не менее, я чувствую, что это должно быть непротекающим. У меня есть сохранение в моем файле .h, так что, конечно, мне нужен релиз в моем методе dealloc? –

+0

, если вы сделаете 'self.textField1 = nil;', который выйдет из него (как сеттер освободит текущее значение, а затем установит новое значение (в данном случае нуль)). Но было сказано, что использование аксессуаров и сеттеров в dealloc может создать проблемы. Обычным способом является '[textField1 release];' как вы это сделали –

Смежные вопросы