2012-12-08 149 views
2

我正在使用UIView。該應用程序正在使用ARC。 UIView用於多個視圖控制器。在UIView中添加了UIKeyboardDidHideNotification的收聽者。偵聽器在一些視圖控制器和其他視圖控制器下正常工作會使應用程序崩潰。特別是當我在第一次使用後在第二個視圖控制器中使用。該錯誤是UIKeyboardDidHideNotification錯誤應用程序崩潰

* - [APPNAME keyboardWillHide]:發送到釋放實例0xb9c2760

在某些情況下監聽獲取調用兩次消息。

i。在的UIView的drawRect方法已經添加的代碼是:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide) name:UIKeyboardWillHideNotification object:nil]; 

對於聽者的代碼是

-(void)keyboardWillHide 
{ 
    if(boolisViewlifted) 
    { 

      CGRect newFrame=self.frame; 
      newFrame=CGRectMake(self.frame.origin.x, self.frame.origin.y+250, self.frame.size.width, self.frame.size.height); 
      self.frame=newFrame; 
      boolisViewlifted=false; 

    } 
} 

了UIView出現在呼叫視圖控制器的頂部。請讓我知道是什麼原因導致這個錯誤以及如何解決它。

回答

1

由於內存警告,您的視圖正在卸載。您需要覆蓋dealloc方法&刪除所有視圖中您爲通知添加觀察者的所有通知的觀察者。

//do add in all views 
-(void)dealloc 
{ 
    //[super dealloc];//As you are using ARC don't call super's dealloc 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
} 
+0

謝謝..它現在有效。但在這裏我有一個澄清 - 我的項目中使用ARC,仍然爲什麼需要手動刪除dealloc中的觀衆。 – user1531912

+0

添加通知的觀察者並不意味着一些內存將被分配給它,它將被ARC自動釋放。添加觀察者意味着您正在註冊您的課程(或對象)以獲取通知,並且ARC不會註銷您的課程。你必須這樣做。 –

+0

請參閱下面的鏈接以澄清有關刪除觀察者的地方 - http://stackoverflow.com/questions/7827953/removing-observers-in-post-arc-cocoa http://stackoverflow.com/questions/7292119/custom -dealloc-using-arc-objective-c –