下邊是一個(gè)定時(shí)器的創(chuàng)建方法:
+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo;
target:The object to which to send the message specified by aSelector when the timer fires. The timer maintains a strong reference to this object until it (the timer) is invalidated.
target:定時(shí)器會強(qiáng)引用target直到定時(shí)器終止拙泽。
因此現(xiàn)在很明確了,如果把定時(shí)器申明成了target的屬性裸燎,那將必然引起循環(huán)引用顾瞻。這個(gè)有分為兩種情況:
情況一:target是ViewController
這時(shí)候我們要想不造成循環(huán)引用,解決方案是在viewWillDisappear的關(guān)閉定時(shí)器德绿。
情況二:target為我們封裝的空間
如果target是我們自己封裝的控件荷荤,那怎么辦呢?如果我們依然在viewWillDisappear里邊停掉定時(shí)器的話豈不是破壞了這個(gè)控件的封裝性移稳。如果這個(gè)控件交給別人使用的話蕴纳,還得讓別人注意要在viewWillDisappear中停掉定時(shí)器。
蘋果提供了一個(gè)方法:
- (void)willMoveToSuperview:(nullable UIView *)newSuperview;
Tells the view that its superview is about to change to the specified superview.
The default implementation of this method does nothing. Subclasses can override it to perform additional actions whenever the superview changes.
告訴子視圖它現(xiàn)在的父視圖準(zhǔn)備把它移動到特定的視圖上个粱。默認(rèn)這個(gè)方法的實(shí)現(xiàn)是什么也不做古毛。子視圖可以重寫來執(zhí)行額外的方法無論父視圖什么時(shí)候改變。