2011-03-11 50 views
1

我有一個應用程序,它只是由一個UITextView組成。一旦應用程序加載,鍵盤就會出現,並在鍵盤頂部加載一個AccessoryView以解除它。加載inputAccessoryView的問題

這工作出色,直到我決定我不想在應用程序加載時加載鍵盤。問題是,每當我嘗試編輯文本時,應用程序崩潰(EXC_BAD_ACCESS)。我不明白爲什麼會這樣。這裏是我的代碼 - 該通道被標記出故障的應用程序:

- (void)viewWillAppear:(BOOL)animated { 

// Make the keyboard appear when the application launches. 
[super viewWillAppear:animated]; 
// [textView becomeFirstResponder];} 

然後:

- (BOOL)textViewShouldBeginEditing:(UITextView *)aTextView { 


    // this crashes app if no keyboard is loaded in viewdidload: 

     if (textView.inputAccessoryView == nil) { 
     textView.inputAccessoryView = accessoryView;  
     self.accessoryView = nil; 

} 


    return YES; 
} 

如果我註釋掉最後if語句,應用程序的工作......但我不沒有我的accessoryView。有可能我在InterfaceBuilder中做了錯誤的事情嗎? accessoryView是我的ViewController中的一個單獨的視圖。雖然它連接正確(如果我用帶鍵盤的應用程序開始,它確實工作得很好)。

任何想法將非常感激。對不起,如果這是顯而易見的,但我仍然是一個初學者,這些事情造成巨大的麻煩。

回答

1

當您嘗試將消息發送到已釋放的對象時,會發生EXC_BAD_ACCESS錯誤。確保當你設置你的ivars時,如果你使用一個返回自動釋放對象的便捷方法,你將調用retain。

如果這不起作用,你可以看看使用NSZombieEnabled來跟蹤你發送消息到釋放對象的位置。

我發現一對夫婦將引導您可以在來看看:

http://www.fromconcentratesoftware.com/2007/08/09/nszombieenabled-for-the-debugger-adverse/

http://collateraldamag3.blogspot.com/2009/11/iphone-tutorial-nszombieenabled-and.html

+0

謝謝,真的很有幫助!那麼,事實證明,我從Apple的樣品複製了AccessoryView的代碼,並且將附件視圖聲明爲'@property(nonatomic,assign)IBOutlet UIView * accessoryView;'我現在有'@property(nonatomic,retain)IBOutlet UIView * accessoryView;'和應用程序不會崩潰了。在這種情況下,保留和分配究竟有什麼區別? Apple加載了一個accessoryView筆尖,而我的accessoryView是我的ViewController筆尖的一個視圖 - 這是原因嗎? –

+0

@ n.evermind賦值和保留屬性之間的區別在合成的setter方法中。對於分配,設置者只是將傳入的值賦予伊娃,保留,設置者釋放舊值,將伊娃設置爲新值並保留呼叫。有關更多信息,可以閱讀[聲明的屬性](http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html#//apple_ref/doc/uid/ TP30001163-CH17-SW1)來自Apple的文檔 –