【iOS】UIViewController的生命週期

來源:互聯網
上載者:User

標籤:log   編碼   lap   上下級   rbo   TE   elf   nss   nim   

-(void)loadView;
  • loadView方法在UIVIewController的view被訪問且為空白的時候調用。
  • loadView方法不應該直接被調用,而是由系統調用。它會載入或建立一個View並把它賦值給UIViewController的view屬性。
    以下代碼會導致死迴圈

-(void)loadView{
NSLog(@"ViewController loadView");
}

  • (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    NSLog(@"ViewController viewDidLoad");
    self.view.backgroundColor = [UIColor whiteColor];
    }
- (void)viewDidLoad;
  • 當loadView將view載入完成,會調用viewDidLoad方法,該方法在UIVIewController初始化過程中只會執行一次,在該方法中可以進行頁面相關的初始化。

    -(void)viewWillAppear:(BOOL)animated;
  • 頁面將要出現時調用。頁面每次即將出現時都會調用。
  • 當app有多級ViewController,pop操作後都會調用即將出現的ViewController的該方法,如果每次ViewController的出現都需要重新整理頁面,可在該方法中實現。

    -(void)viewWillLayoutSubviews;
  • ViewController的view即將對subviews進行布局。

    -(void)viewDidLayoutSubviews;
  • ViewController的view對subviews的布局完成。

    -(void)viewDidAppear:(BOOL)animated;
  • 頁面已經出現時調用。頁面每次出現時都會調用。
  • 在view被添加到視圖層級中以及多視圖,上下級視圖切換時調用這個方法,在這裡可以對正在顯示的視圖做進一步的設定。

    -(void)viewWillDisappear:(BOOL)animated;
  • 頁面將要消失時調用。可能會被多次調用。
  • 頁面之間push或者pop時都會調用。

    -(void)viewDidDisappear:(BOOL)animated;
  • 頁面已經消失時調用。可能會被多次調用。
  • 頁面之間push或者pop時都會調用。

    -(void)dealloc;
  • 頁面被銷毀時調用。
  • 該方法可以用來調試頁面是否存在記憶體流失,如果存在,在頁面出棧時將不會調用該方法。
  • 在該方法中可以處理需要手動釋放的東西,比如觀察者的移除。

    常用周期方法執行順序

    由於我編碼習慣是純程式碼布局,所以對xib布局和storyboard布局的相關方法未加研究,代碼如下

  • (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    NSLog(@"ViewController viewDidLoad");
    self.view.backgroundColor = [UIColor whiteColor];
    }

-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
NSLog(@"ViewController viewWillAppear");
}

-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
NSLog(@"ViewController viewDidAppear");
}

-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
NSLog(@"ViewController viewWillDisappear");
}

-(void)viewDidDisappear:(BOOL)animated{
[super viewDidDisappear:animated];
NSLog(@"ViewController viewDidDisappear");
}

-(void)viewWillLayoutSubviews{
[super viewWillLayoutSubviews];
NSLog(@"ViewController viewWillLayoutSubviews");
}

-(void)viewDidLayoutSubviews{
[super viewDidLayoutSubviews];
NSLog(@"ViewController viewDidLayoutSubviews");
}

  • (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
    }

  • 列印結果:

ViewController viewDidLoad
ViewController viewWillAppear
ViewController viewWillLayoutSubviews
ViewController viewDidLayoutSubviews
ViewController viewDidAppear

以上只是顯示一個頁面的代碼和列印結果,下面我們來看一下頁面間的跳轉時,生命週期執行的順序。
從A頁面調轉到B頁面,A頁面代碼:

  • (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    NSLog(@"A viewDidLoad");
    self.view.backgroundColor = [UIColor whiteColor];
    }

-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
NSLog(@"A viewWillAppear");
}

-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
NSLog(@"A viewDidAppear");
}

-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
NSLog(@"A viewWillDisappear");
}

-(void)viewDidDisappear:(BOOL)animated{
[super viewDidDisappear:animated];
NSLog(@"A viewDidDisappear");
}

-(void)viewWillLayoutSubviews{
[super viewWillLayoutSubviews];
NSLog(@"A viewWillLayoutSubviews");
}

-(void)viewDidLayoutSubviews{
[super viewDidLayoutSubviews];
NSLog(@"A viewDidLayoutSubviews");
}

  • (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
    }

-(void)touchesBegan:(NSSet

B頁面代碼:

  • (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    NSLog(@"B viewDidLoad");
    self.view.backgroundColor = [UIColor whiteColor];
    }

-(void)dealloc{
NSLog(@"B dealloc");
}

-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
NSLog(@"B viewWillAppear");
}

-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
NSLog(@"B viewDidAppear");
}

-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
NSLog(@"B viewWillDisappear");
}

-(void)viewDidDisappear:(BOOL)animated{
[super viewDidDisappear:animated];
NSLog(@"B viewDidDisappear");
}

-(void)viewWillLayoutSubviews{
[super viewWillLayoutSubviews];
NSLog(@"B viewWillLayoutSubviews");
}

-(void)viewDidLayoutSubviews{
[super viewDidLayoutSubviews];
NSLog(@"B viewDidLayoutSubviews");
}

  • (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
    }

-(void)touchesBegan:(NSSet

}

從A頁面跳轉到B頁面,再從B頁面回到A頁面,列印結果:

A viewDidLoad
A viewWillAppear
A viewWillLayoutSubviews
A viewDidLayoutSubviews
A viewDidAppear
************************跳轉啦****************************
B viewDidLoad
A viewWillDisappear
B viewWillAppear
B viewWillLayoutSubviews
B viewDidLayoutSubviews
A viewDidDisappear
B viewDidAppear
************************回去啦****************************
B viewWillDisappear
A viewWillAppear
B viewDidDisappear
A viewDidAppear
B dealloc

【iOS】UIViewController的生命週期

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.