IOS UIView的生命周期的实例详解

 更新时间:2017年09月12日 11:23:36   作者:番薯大佬  
这篇文章主要介绍了IOS UIView的生命周期的实例详解的相关资料,希望通过本文大家能掌握理解这部分内容,需要的朋友可以参考下

IOS UIView的生命周期的实例详解

任何对象的者有一个生命周期,即都存在一个实例化到销毁的过程。

UIView对象也不例外,那么UIView从init/new开始后,直到dealloc结束的过程中都经历了哪些过程呢?

首先自定义继承自UIView的对象LifeView

#import <UIKit/UIKit.h> 
 
@interface LifeView : UIView 
 
@end 
#import "LifeView.h" 
 
@interface LifeView () 
{ 
  NSInteger count; 
} 
 
@end 
 
@implementation LifeView 
 
- (instancetype)initWithFrame:(CGRect)frame 
{ 
  self = [super initWithFrame:frame]; 
  if (self) 
  { 
    NSLog(@"<-- 1 %s , count = %@-->", __func__, @(count++)); 
  } 
  return self; 
} 
 
 
- (void)willMoveToSuperview:(nullable UIView *)newSuperview 
{ 
  NSLog(@"<-- 2 %s , count = %@-->", __func__, @(count++)); 
} 
 
- (void)didMoveToSuperview 
{ 
  NSLog(@"<-- 3 %s , count = %@-->", __func__, @(count++)); 
} 
 
- (void)willMoveToWindow:(nullable UIWindow *)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 { 
  [super viewDidLoad]; 
  // Do any additional setup after loading the view. 
   
  self.title = @"life view"; 
   
  LifeView *lifeView = [[LifeView alloc] initWithFrame:CGRectMake(10.0, 80.0, 100.0, 100.0)]; 
  [self.view addSubview:lifeView]; 
  lifeView.tag = 1000; 
  lifeView.backgroundColor = [UIColor orangeColor]; 
} 

当B视图控制器被push,或present出来时,被调用的LifeView的相关方法,如下所示:

// 实例化时 
2017-06-16 00:37:10.694 DemoViewLife[3963:121184] <-- 1 -[LifeView initWithFrame:] , count = 0--> 
2017-06-16 00:37:10.695 DemoViewLife[3963:121184] <-- 2 -[LifeView willMoveToSuperview:] , count = 1--> 
2017-06-16 00:37:10.695 DemoViewLife[3963:121184] <-- 3 -[LifeView didMoveToSuperview] , count = 2--> 
2017-06-16 00:37:10.697 DemoViewLife[3963:121184] <-- 4/7 -[LifeView willMoveToWindow:] , count = 3--> 
2017-06-16 00:37:10.697 DemoViewLife[3963:121184] <-- 5/8 -[LifeView didMoveToWindow] , count = 4--> 
2017-06-16 00:37:10.701 DemoViewLife[3963:121184] <-- 6 -[LifeView layoutSubviews] , count = 5--> 

当B视图控制器被pop,或dismiss时,被调用的LifeView的相关方法,如下所示:

// 销毁时 
2017-06-16 00:37:25.514 DemoViewLife[3963:121184] <-- 4/7 -[LifeView willMoveToWindow:] , count = 6--> 
2017-06-16 00:37:25.514 DemoViewLife[3963:121184] <-- 5/8 -[LifeView didMoveToWindow] , count = 7--> 
2017-06-16 00:37:25.515 DemoViewLife[3963:121184] <-- 9 -[LifeView removeFromSuperview] , count = 8--> 
2017-06-16 00:37:25.516 DemoViewLife[3963:121184] <-- 9 -[LifeView removeFromSuperview] , count = 9--> 
2017-06-16 00:37:25.518 DemoViewLife[3963:121184] <-- 10 -[LifeView dealloc] , count = 10--> 

从打印信息可以看到方法"removeFromSuperview"被调用了两次,这是因为在B视图控制器中,主动调用了该方法。如果没有主动调用该方法的话,只会被调用一次。

另外被执行过两次的方法还有"willMoveToWindow"和"didMoveToWindow"。我们可以很好地进行区分,当newWindow存在时,则是实例化创建被第一次调用;而当newWindow为nil时,则是被销毁了,即结束生命周期。

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • iOS实现逐帧动画做loading视图

    iOS实现逐帧动画做loading视图

    这篇文章主要为大家详细介绍了iOS实现逐帧动画做loading视图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • iOS中设置view圆角化的四种方法示例

    iOS中设置view圆角化的四种方法示例

    最近因为工作的原因,遇到view圆角优化的问题,所以将实现的几种方法总结分享出来,下面这篇文章主要给大家介绍了关于iOS中设置view圆角化的四种方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2017-09-09
  • iOS实现计算器小功能

    iOS实现计算器小功能

    这篇文章主要介绍了iOS实现计算器小功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • IOS中实现图片点击全屏预览

    IOS中实现图片点击全屏预览

    IOS作为一款智能手机系统,在查看图片的时候,如果能够实现全屏,对用户来说有很好的视觉体验,其实实现起来非常的简单,下面我就结合一个简单的代码给大家来分享一下,,需要的朋友可以参考下
    2015-11-11
  • iOS开发中runtime常用的几种方法示例总结

    iOS开发中runtime常用的几种方法示例总结

    Runtime也就是所谓的“运行时”,因为是在运行时实现的。下面这篇文章主要给大家介绍了关于iOS开发中runtime常用的几种方法的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-08-08
  • 百度地图PC端判断用户是否在配送范围内

    百度地图PC端判断用户是否在配送范围内

    在pc端设置商家的配送范围,用户在下单时,根据用户设置的配送地点判断是否在可配送范围内,并给用户相应的提示,下面通过本文给大家分享具有实现代码,感兴趣的朋友一起学习吧
    2016-01-01
  • iOS开发之UIScrollView详解

    iOS开发之UIScrollView详解

    UIScrollView使用非常广,本文研究UIScrollView各属性和方法,明白它们的意义、作用。这里我们整理UIScrollView一些常见用法以及一些效果的实现思路。
    2016-04-04
  • iOS如何巧妙解决NSTimer的循环引用详解

    iOS如何巧妙解决NSTimer的循环引用详解

    这篇文章主要给大家介绍了关于iOS如何巧妙解决NSTimer的循环引用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-03-03
  • Unity移动端的复制要这么写示例代码

    Unity移动端的复制要这么写示例代码

    这篇文章主要给大家介绍了关于Unity移动端的复制的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧
    2018-08-08
  • iOS10最新实现远程通知的开发教程详解

    iOS10最新实现远程通知的开发教程详解

    这篇文章主要介绍了iOS10最新远程通知开发的实现过程,文章先对推送通知以及远程推送通知等进行了基本介绍,然后通过示例代码详细介绍了iOS10 全新远程通知的教程,有需要的朋友们可以参考借鉴,下面来一起看看吧。
    2016-09-09

最新评论