IOS UIView的生命周期的实例详解
IOSUIView的生命周期的实例详解
任何对象的者有一个生命周期,即都存在一个实例化到销毁的过程。
UIView对象也不例外,那么UIView从init/new开始后,直到dealloc结束的过程中都经历了哪些过程呢?
首先自定义继承自UIView的对象LifeView
#import@interfaceLifeView:UIView @end
#import"LifeView.h" @interfaceLifeView() { NSIntegercount; } @end @implementationLifeView -(instancetype)initWithFrame:(CGRect)frame { self=[superinitWithFrame:frame]; if(self) { NSLog(@"<--1%s,count=%@-->",__func__,@(count++)); } returnself; } -(void)willMoveToSuperview:(nullableUIView*)newSuperview { NSLog(@"<--2%s,count=%@-->",__func__,@(count++)); } -(void)didMoveToSuperview { NSLog(@"<--3%s,count=%@-->",__func__,@(count++)); } -(void)willMoveToWindow:(nullableUIWindow*)newWindow { NSLog(@"<--4/7%s,count=%@-->",__func__,@(count++)); } -(void)didMoveToWindow { NSLog(@"<--5/8%s,count=%@-->",__func__,@(count++)); } -(void)layoutSubviews { NSLog(@"<--6%s,count=%@-->",__func__,@(count++)); } -(void)removeFromSuperview { NSLog(@"<--9%s,count=%@-->",__func__,@(count++)); } -(void)dealloc { NSLog(@"<--10%s,count=%@-->",__func__,@(count++)); } @end
其次,在B视图控制器中实例化,并添加到父视图
-(void)viewDidLoad{ [superviewDidLoad]; //Doanyadditionalsetupafterloadingtheview. self.title=@"lifeview"; LifeView*lifeView=[[LifeViewalloc]initWithFrame:CGRectMake(10.0,80.0,100.0,100.0)]; [self.viewaddSubview:lifeView]; lifeView.tag=1000; lifeView.backgroundColor=[UIColororangeColor]; }
当B视图控制器被push,或present出来时,被调用的LifeView的相关方法,如下所示:
//实例化时 2017-06-1600:37:10.694DemoViewLife[3963:121184]<--1-[LifeViewinitWithFrame:],count=0--> 2017-06-1600:37:10.695DemoViewLife[3963:121184]<--2-[LifeViewwillMoveToSuperview:],count=1--> 2017-06-1600:37:10.695DemoViewLife[3963:121184]<--3-[LifeViewdidMoveToSuperview],count=2--> 2017-06-1600:37:10.697DemoViewLife[3963:121184]<--4/7-[LifeViewwillMoveToWindow:],count=3--> 2017-06-1600:37:10.697DemoViewLife[3963:121184]<--5/8-[LifeViewdidMoveToWindow],count=4--> 2017-06-1600:37:10.701DemoViewLife[3963:121184]<--6-[LifeViewlayoutSubviews],count=5-->
当B视图控制器被pop,或dismiss时,被调用的LifeView的相关方法,如下所示:
//销毁时 2017-06-1600:37:25.514DemoViewLife[3963:121184]<--4/7-[LifeViewwillMoveToWindow:],count=6--> 2017-06-1600:37:25.514DemoViewLife[3963:121184]<--5/8-[LifeViewdidMoveToWindow],count=7--> 2017-06-1600:37:25.515DemoViewLife[3963:121184]<--9-[LifeViewremoveFromSuperview],count=8--> 2017-06-1600:37:25.516DemoViewLife[3963:121184]<--9-[LifeViewremoveFromSuperview],count=9--> 2017-06-1600:37:25.518DemoViewLife[3963:121184]<--10-[LifeViewdealloc],count=10-->
从打印信息可以看到方法"removeFromSuperview"被调用了两次,这是因为在B视图控制器中,主动调用了该方法。如果没有主动调用该方法的话,只会被调用一次。
另外被执行过两次的方法还有"willMoveToWindow"和"didMoveToWindow"。我们可以很好地进行区分,当newWindow存在时,则是实例化创建被第一次调用;而当newWindow为nil时,则是被销毁了,即结束生命周期。
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!