2012-05-20 38 views
1

我有一個UITableViewCell的子類,當它碰到[super dealloc]行時會崩潰。我有幾個textFields在我的單元格和錯誤信息是說*** -[UITextField release]: message sent to deallocated instance 0x739dfd0自定義的UITableViewCell崩潰[super dealloc]

相關的代碼片斷如下(我有其他的textFields,但他們都以同樣的方式處理,我懷疑是這樣做與添加到。細胞的內容查看,但我不知道如何糾正它

自定義的UITableViewCell的.h文件中:

@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

這仍然會泄漏。當你分配一個保留屬性時,你必須在之後自動釋放或釋放該對象,因爲屬性的設置者已經保留了它(也就是說,如果你不使用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調用setter,它保留了它,因爲你已經用retain屬性聲明瞭它,然後你有責任釋放它(你的dealloc實現是正確的)。 Offtopic:當將其添加到contentView作爲子視圖時,也會保留文本字段,但您不對其內存管理負責,但contentView是.. – graver

+0

...仍然無法正常工作。我明白你所說的話,這很有道理。這裏一定還有別的事情要做。 –

0

套裝textfield對象爲零而不是釋放它。其次,請在編碼時使用適當的命名約定。

+0

我試試這個謝謝。至於命名約定 - 我實際上並沒有使用textField1,只是在SO上發佈以縮短和縮短相關代碼塊時更容易。已經工作的 –

+0

。但是,我覺得這應該是漏洞。我的.h文件中有一個保留,所以我需要在我的dealloc方法中使用一個版本? –

+0

如果你做'self.textField1 = nil;'它會釋放它(當setter釋放當前值,然後設置新值(在這種情況下爲nil))。但有人說,在dealloc中使用訪問器和setter可能會產生問題。通常的做法是像你所做的那樣做'[textField1 release];' –