国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > iOS > 正文

IOS UIView的生命周期的實例詳解

2020-07-26 02:41:55
字體:
來源:轉載
供稿:網友

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時,則是被銷毀了,即結束生命周期。

如有疑問請留言或者到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 拜泉县| 乳源| 江源县| 平舆县| 崇州市| 湾仔区| 富宁县| 巴塘县| 洛宁县| 汉寿县| 阿巴嘎旗| 汾阳市| 长葛市| 印江| 固阳县| 修武县| 青神县| 维西| 林芝县| 七台河市| 蒙山县| 湘潭县| 祁连县| 盐山县| 金阳县| 盘山县| 新巴尔虎右旗| 应城市| 西藏| 晋州市| 三台县| 中卫市| 铜陵市| 南部县| 田东县| 玉门市| 贵南县| 石狮市| 泸定县| 青河县| 大丰市|