2015-02-08 275 views
0

Apple的文檔中提到「當觸發segue時,會導致新的視圖控制器被實例化並在屏幕上轉換。」我看到的一些行爲讓我質疑VC是否真的被銷燬,並且每次視圖都會被重新創建。viewController生命週期

在我的應用程序每次我塞克到特定視圖時我注意到下面的viewController函數被調用(這是與VC一致在每次sequed時間被重新創建):

- (id)initWithCoder:(NSCoder *)aDecoder 

注,這是的viewController也是一個數據源爲它的的CollectionView和有一個屬性:

@property (strong, nonatomic) NSMutableArray *messages; 

而且每次的initWithCoder叫我ALLOC時間和初始化一個消息數組,並將其分配給上述指針。

當我導航回到另一個視圖,然後再次返回時,我看到奇怪,我認爲VC可能被重新使用。或者,如果第一個實例沒有被銷燬並且仍然可以接收通知。

第一件奇怪的事情是,在viewDidLoad中,如果我爲特定的通知調用addObserver:self,我希望這個VC處理,那麼我第二次進入這個VC時,我會得到兩個通知發送給VC的通知處理每個發送的通知。這與被重用的VC一致,否則爲什麼處理程序會被調用兩次?

但與這種重用場景相反,initWithCoder實際上是在第二次加載視圖時調用的。

由於我不想爲每個通知帖子生成2個或更多通知,我使用靜態布爾值來保證addObserver只被調用一次。即addObserver僅在第一次調用viewDidLoad時調用,而不是後續時間。

viewDidLoad和通知處理程序訪問消息數組。在第二個seque中,viewDidLoad似乎訪問一個新的alloc/init'd消息數組,但是當通知處理程序訪問消息時,它似乎是上次加載VC時的前一個消息數組。

任何想法?

回答

0

一旦視圖被解散,請確保您在這些特定鍵上取消註冊爲觀察者。您可能仍然執行舊方法,因爲它們從未未註冊。

+0

是的我在晚餐時就考慮過這個問題,我認爲這肯定是通知中心對viewController持有一個強烈的引用。 – bhartsb 2015-02-08 03:47:37