2011-07-06 20 views
0

我得到NSCFData resignFirstResponder - 無法識別的選擇器發送到實例。但爲什麼?錯誤:NSCFData resignFirstResponder - 無法識別的選擇器發送到實例。但爲什麼?

@interface { UITextField *Field; } @end 
@implementation 
-(BOOL) textFieldShouldBeginEditing:(UITextField*)textField { 
    Field = textField; 
    return YES; 
} 

-(void) viewWillDisappear:(BOOL)animated 
{ 
    [Field resignFirstResponder]; 
} 
@end 

我的調用堆棧

 
0 CoreFoundation      0x35f08c7b __exceptionPreprocess + 114 
1874   1 libobjc.A.dylib      0x30186ee8 objc_exception_throw + 40 
1875   2 CoreFoundation      0x35f0a3e3 -[NSObject(NSObject) doesNotRecognizeSelector:] + 98 
1876   3 CoreFoundation      0x35eaf467 ___forwarding___ + 506 
1877   4 CoreFoundation      0x35eaf220 _CF_forwarding_prep_0 + 48 
1878   5 MegaDish       0x000187eb -[MapViewController viewWillDisappear:] + 34 
1879   6 UIKit        0x3389d438 -[UINavigationController viewWillDisappear:] + 112 

回答

2

你的文本字段中得到了釋放,可能在-viewDidUnload。然後一個NSData對象被分配在內存中的相同位置。執行-textFieldDidEndEditing:並清除Field伊娃至nil,並且問題應該解決。

+0

首先系統調用viewWillDisappear,然後是viewDidUnload。我對嗎? – Voloda2

+0

是的,但它可能會再次調用'-viewWillDisappear:','-viewDidUnload','-viewDidLoad','-viewWillAppear:',最後是'-viewWillDisappear:'。關鍵是你沒有正確地管理你的內存,並且你最終得到一個糟糕的指針。 –

1

大概你需要保留字段。

1

@ Jonathan的替代答案是,當您獲得所有權並在完成後釋放它時,保留您的文本字段。

也是一個註釋:習慣上Objective-c中的變量以小寫字母開頭。類名以大寫字母開頭。

相關問題