[英]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.