0

我有UIViewController的內存奇怪的問題。UIViewcontroller奇怪的問題

考慮以下情形,其中,我有的ViewController甲即一個導航堆棧的一部分,並且是另一個的ViewController SUPERA的子類。

考慮另一個ViewController B這是SuperB的子類。

我推動並彈出ViewController BViewController A中的一些特定動作之後。 在這兩個ViewControllers我使用NSNotificationObservers一些事件。 每當一個事件被觸發,即使如果我的ViewController乙我不是我仍然能夠接收到該事件中的ViewController B.

  1. 導航堆棧並不表明的ViewController乙
  2. 如果沒有的ViewController乙在導航棧,哪裏該特別的ViewController乙存在嗎?
  3. 我該如何刪除/處置此ViewController B?另外我相信這是由於SuperB不能解除分配?我對嗎?
+0

你是對的 - 很可能ViewController B沒有被取消分配。一個常見的罪魁禍首是保留週期,其中兩個對象彼此之間有很強的關係,當一個人試圖釋放時,它不會因爲另一個對象存在而繼續保留。一個常見的原因是擁有一個非弱的代表。另一種可能性,取決於iOS的版本,是NSNotification觀察者 - 這些應該在補充的UIViewController生命週期階段被移除 - 例如,如果在viewWillApppear中設置,他們應該在'viewWillDisappear'中被移除。 – bobnoble

+0

我試過寫一個虛擬應用程序,可以完成上述場景,奇怪的是這隻發生在Xamarin.iOS中 – vin

回答

0

NSNotificationCenter是一個集中的中心,可以向註冊的觀察者廣播信息。每次發生事件時,通知都會通過其派發表,並向該事件的任何註冊觀察者發送消息。

通知觀察者在默認情況下引用強,並且由於強引用,這些觀察者在默認情況下不會被釋放。所以,當你離開UIViewController時,刪除它是強有力的參考。

代碼:

override func viewWillDisappear(_ animated: Bool) { 
     super.viewWillDisappear(animated) 
     NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: "name"), object: nil) 
} 

希望,它會幫助你。