簡體   English   中英

viewController生命周期

[英]viewController lifecycle

蘋果的文檔說:“觸發segue時,它將導致實例化一個新的視圖控制器並在屏幕上進行轉換。” 我看到的某些行為讓我質疑,每次視圖固定后,VC是否實際上已銷毀並重新創建。

在我的應用程序中,每次我確定一個特定的視圖時,我都會注意到以下viewController函數被調用(這與每次創建VC時重新創建的VC一致):

- (id)initWithCoder:(NSCoder *)aDecoder 

請注意,此viewController也是其collectionView的數據源,並具有一個屬性:

@property (strong, nonatomic) NSMutableArray *messages;

每次調用initWithCoder時,我都會分配並初始化一個消息數組,並將其分配給上述指針。

當我導航回到另一種視圖然后再次固定時,我看到一種奇怪的想法,使我認為VC可能會被重新使用。 或者,如果第一個實例未被銷毀並且仍然可以接收通知,則可以選擇。

奇怪的第一件事是,如果我為要讓該VC處理的特定通知調用addObserver:self在viewDidLoad中,那么我第二次選擇該VC時,對於每個通知,我都會收到兩個通知發送到VC的通知處理程序發送。 這與VC被重用一致,否則為什么處理程序將被調用兩次?

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

由於我不希望為每個通知帖子生成2個或更多通知,因此我使用靜態布爾值來確保addObserver僅被調用一次。 即addObserver僅在第一次調用viewDidLoad時調用,而在隨后的時間不調用。

viewDidLoad和通知處理程序訪問messages數組。 在第二個問題上,viewDidLoad似乎正在訪問新分配/初始化的消息數組,但是當通知處理程序訪問消息時,它似乎是上次加載VC以來的先前消息數組。

有任何想法嗎?

一旦關閉視圖,請確保您正在注銷自己作為這些特定鍵的觀察者。 您可能仍在執行舊方法,因為它們從未取消注冊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM