這個(gè)問(wèn)題的關(guān)鍵在于 UIView 的生命周期。
- (void)didAddSubview:(UIView *)subview;
- (void)willRemoveSubview:(UIView *)subview;
- (void)willMoveToSuperview:(nullable UIView *)newSuperview;
- (void)didMoveToSuperview;
- (void)willMoveToWindow:(nullable UIWindow *)newWindow;
- (void)didMoveToWindow;
有興趣的同學(xué)可以 自己驗(yàn)證一下 這些方法的調(diào)用順序。
這里直接拋結(jié)論:
從上往下依次執(zhí)行贴汪,但下面這四個(gè)方法比較特殊,調(diào)了兩次休吠。
- (void)willMoveToSuperview:(nullable UIView *)newSuperview;
- (void)didMoveToSuperview;
- (void)willMoveToWindow:(nullable UIWindow *)newWindow;
- (void)didMoveToWindow;
官方給出的解釋是:
view的父類變化時(shí)扳埂,無(wú)論是添加還是移除,都是調(diào)用will和did兩個(gè)方法瘤礁。一次是add阳懂,一次是remove。帶參數(shù)的will方法中,參數(shù)不為空是添加岩调,為空時(shí)移除巷燥。
代碼如下:
-(void)willMoveToWindow:(UIWindow *)newWindow{
if (!newWindow) {
if (_timer) {
[_timer invalidate];
_timer = nil;
}
}
}