1. 程式人生 > >IOS的生命週期問題

IOS的生命週期問題

開發Android必須得清楚Android生命週期才能很好的掌控程式的框架,讓整個專案思路更加清晰流暢,因此IOS也是必須要了解IOS的生命週期

先從一個簡單的例項來看看

AppDelegate.m檔案裡面的內容如下:

//
//  AppDelegate.m
//  SwitchView
//
//  Created by Pishum on 15/5/5.
//  Copyright (c) 2015年 Pishum. All rights reserved.
//

#import "AppDelegate.h"
#import "ViewController.h"
@interface AppDelegate ()
{
//    ViewController *main;
//    UINavigationController *nav;
}
@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    NSLog(@"APP   didFinishLaunchingWithOptions");
    
    
    
//    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
//    // Override point for customization after application launch.
//    
//    _storyBoard  = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
//    
//    main = [_storyBoard instantiateViewControllerWithIdentifier:@"main"];
//    nav = [[UINavigationController alloc] initWithRootViewController: main];
//    [self.window addSubview:nav.view];
    
    return YES;
}

- (void)applicationWillResignActive:(UIApplication *)application {
    // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
    // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
    
    NSLog(@"APP   applicationWillResignActive");
}

- (void)applicationDidEnterBackground:(UIApplication *)application {
    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
     NSLog(@"APP   applicationDidEnterBackground");
}

- (void)applicationWillEnterForeground:(UIApplication *)application {
    // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
     NSLog(@"APP   applicationWillEnterForeground");
}

- (void)applicationDidBecomeActive:(UIApplication *)application {
    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
     NSLog(@"APP   applicationDidBecomeActive");
}

- (void)applicationWillTerminate:(UIApplication *)application {
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
    
     NSLog(@"APP   applicationWillTerminate");
}

@end

ViewController.m的內容如下
//
//  ViewController.m
//  SwitchView
//
//  Created by Pishum on 15/5/5.
//  Copyright (c) 2015年 Pishum. All rights reserved.
//

#import "AppDelegate.h"
#import "ViewController.h"
#import "SecondViewController.h"
#import "TestXXX.h"
@interface ViewController ()
{

}
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    UIBarButtonItem *backbutton = [[UIBarButtonItem alloc]init];
    backbutton.title = @"返回列表";
    self.navigationItem.backBarButtonItem = backbutton;
    // Do any additional setup after loading the view, typically from a nib.
     NSLog(@"A    viewDidLoad");
    
}

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

- (IBAction)startNewView:(id)sender {
  
    UIButton* btn = (UIButton*)sender;

    switch (btn.tag) {
        case 1:
//            [self performSegueWithIdentifier:@"second" sender:self];

//            NSLog(@"onclick  ==%@",self.navigationController);
            break;
            
//        default:
//            break;
    }
    
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    

    if ([[segue identifier] isEqualToString:@"second"]) {
 
//        id object = @"傳入一個值";
        TestXXX *object = [[TestXXX alloc]init];
        object.name = @"xxx";
        
[email protected]
"22";         [[segue destinationViewController] setPrevData:object];     } } - (void)viewDidUnload{     NSLog(@"A   viewDidUnload"); } - (void)viewWillAppear:(BOOL)animated{     NSLog(@"A   viewWillAppear"); } - (void)viewDidAppear:(BOOL)animated{     NSLog(@"A   viewDidAppear"); } - (void)viewWillDisappear:(BOOL)animated{     NSLog(@"A   viewWillDisappear"); } - (void)viewDidDisappear:(BOOL)animated{     NSLog(@"A   viewDidDisappear"); } @end
SecondViewController.m的內容如下
//
//  SecondViewController.m
//  SwitchView
//
//  Created by Pishum on 15/5/5.
//  Copyright (c) 2015年 Pishum. All rights reserved.
//

#import "SecondViewController.h"

@interface SecondViewController (){

}

@end

@implementation SecondViewController
//TestXXX *test;
//NSString* str2;

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    

    NSLog(@"B    viewDidLoad  str=%@",_str);
    NSLog(@"B    name=%@   age=%@",_test.name,_test.age);
}

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

/*
#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
}
*/

- (IBAction)back:(id)sender {
    NSLog(@"點選了第二個btn");

   [self dismissViewControllerAnimated:YES completion:nil];
}


-(id)setPrevData:(id)sender{
    _str = sender;
    _test = sender;
    
    NSLog(@"輸出上個介面得到的資訊====%@  %@  %@",sender,_test.name,_test.age);
    return sender;
}
-(void)setThePrevData:(TestXXX*)sender{
    _test = sender;
//    return sender;
}

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

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

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

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

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



@end

上面的程式碼都很清晰,目的是想建立一個啟動後一個介面裡面包含一個button,然後點選可以進入到第二個介面去

下面是驗證的結果:

UIViewController生命週期

- (void)viewDidLoad;                    啟動

- (void)viewDidUnload;                    

- (void)viewWillAppear:(BOOL)animated;            (很常用)    

- (void)viewDidAppear:(BOOL)animated;            更新檢視

- (void)viewWillDisappear:(BOOL)animated;        即將消失

- (void)viewDidDisappear:(BOOL)animated;        O已經消失

啟動
APP   didFinishLaunchingWithOptions
A    viewDidLoad
A   viewWillAppear
A   viewDidAppear
APP   applicationDidBecomeActive


點選Home鍵
APP   applicationWillResignActive
APP   applicationDidEnterBackground

重新進來
APP   applicationWillEnterForeground
APP   applicationDidBecomeActive


點選按鍵進入B介面
B    viewDidLoad
A   viewWillDisappear
B    viewWillAppear
B    viewDidAppear
A   viewDidDisappear


點選了第二個btn返回到A介面
B    viewWillDisappear
A   viewWillAppear
A   viewDidAppear
B    viewDidDisappear


在B介面雙擊Home然後清理程式
APP   applicationWillResignActive
APP   applicationDidEnterBackground
B    viewWillDisappear
B    viewDidDisappear
APP   applicationWillTerminate

從上面得出的結果很清晰的可以看到,點選home鍵是對UIViewController裡面的生命週期執行沒有任何影響的

只有在介面切換的時候才發現執行了某些方法。

自己不放也做個測試,親身體會下各種情況,很有用的

工程原始碼地址

本文原創,轉載請註明出處

相關推薦

iOS 生命週期

  轉自: 作者:萌面大道 連結:https://www.jianshu.com/p/9d3d95e1ef5a 來源:簡書 簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。 前言 物件的生命週期一直是開發者所需要關心的,教授 CS193p 的老師 Paul

iOS 生命週期的缺失和錯亂

不知道大家有沒有考慮過一個很奇怪的情況,就是 View Controller 的生命週期沒有被呼叫,或者是呼叫順序錯亂?其實這在實際操作中經常發生,override 的時候一不小心就忘記呼叫 super 了,或者明明是 override viewWillAppear(),卻呼叫成了 super.viewWil

iOS生命週期/React Native /幾種設計模式

1 (原生)ios應用的生命週期以及介面的生命週期 ---https://blog.csdn.net/aa19920630/article/details/435642432A   React Native: 是Facebook早先開源的JS框架. B     優點: 跨平臺(A. iOS和安卓. B 支援熱

iOS開發:第一個iOS程式分析——代理,生命週期函式

上一篇文章中我們開發了第一個iOS應用程式,用來計算兩個整數的和,今天我們將介紹其中的兩個檔案: 1.main.m檔案 首先展開supporting Files並且開啟其下的main.m檔案,其中main函式就是應用程式的入口,main函式只是標記了一個自動釋放池自動決定何時釋放記憶體,

IOS初學-生命週期

這裡主要是記錄ios的生命週期 執行專案之後可以進行  開啟   退出到後臺。喚醒  鎖屏  後臺清除等操作,觀察在xcode中打出的log來理解每個方法的呼叫時機   func

iOS第二課 UIViewControl的生命週期和UIIView

生命週期 初始化方法,只會載入一次,裡面是UIView的使用 //只會載入一次 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after load

iOS總結-UIViewController/UIView生命週期

參考: https://www.jianshu.com/p/d60b388b19f5 有關viewController的生命週期 storyBoard情況下的週期 非storyBoard下的週期 1.initWithNibName:bundle

iOS知識學習】_檢視控制物件生命週期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear等的區別及用途

iOS檢視控制物件生命週期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear、viewDidDisappear的區別及用途 init-初始化程式 viewDidLoad-載入檢視 viewWil

iOS程式的啟動執行順序 AppDelegate 及 UIViewController 的生命週期 UIView的生命週期

一. iOS程式的啟動執行順序 ** 程式啟動順序圖 * iOS啟動原理圖 ** 具體執行流程 ** 程式入口 進入main函式,設定AppDelegate稱為函式的代理 程式完成載入[AppDelegate application:didFinishLaunchingWithOptions

UIViewController的生命週期iOS程式執行順序

當一個檢視控制器被建立,並在螢幕上顯示的時候。 程式碼的執行順序 1、 alloc                                   建立物件,分配空間 2、init (initWithNibName) 初始化物件,初始化資料 3、loadView                    

iOS應用程式的生命週期及前後臺切換,應用的各種狀態)

一、iOS應用程式狀態機一共有五種狀態:   1. Not running(未執行):應用還沒有啟動,或者應用正在執行但是途中被系統停止。   2. Inactive(未啟用):當前應用正在前臺執行,但是並不接收事件(當前或許正在執行其它程式碼)。一般每當應用要從一個狀

iOS檢視控制物件生命週期: init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear、viewDidDisappear的區別

iOS檢視控制物件生命週期: init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear、viewDidDisappear的區別及用途 init-初始化程式 viewDidLoad-載入檢視 viewWillAppear-UIVi

iOS App的生命週期

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) ->

iOS檢視的生命週期

進入ViewController的標頭檔案,檢視這個提供的方法,以下列出一些有關iOS檢視生命週期的幾個方法: - (void)viewDidLoad - (void)viewWillAppear:(BOOL)animated - (void)viewDid

iOS-關於應用/檢視的生命週期及程式啟動原理小結

前言:   所有的移動作業系統都有個致命的缺點:app很容易受到打擾。比如一個來電或者鎖屏會導致app進入後臺甚至被終止   還有很多其它類似的情況會導致app受到干擾,在app受到干擾時,會

iOS app生命週期方法執行探究

使用一個新建立的沒有後臺執行的app測試: [LogInfo] 2018-11-06 10:49:25.444 File:AppDelegate Line:30 Function:-[AppDelegate applicationWillResignActive

[iOS]UIViewController生命週期簡單歸納

http://blog.csdn.net/liuyu1114/article/details/24971047 一、呼叫順序: 1. + (id)alloc 分配記憶體; 2. - (id)init 方法(包括

IOS生命週期問題

開發Android必須得清楚Android生命週期才能很好的掌控程式的框架,讓整個專案思路更加清晰流暢,因此IOS也是必須要了解IOS的生命週期 先從一個簡單的例項來看看 AppDelegate.m檔案裡面的內容如下: // // AppDelegate.m // Sw

iOS程式生命週期,蘋果內購、微信支付、支付寶支付

開發4年了,很少寫部落格,主要是懶,哈哈。遇到不清晰的就翻翻以前的程式碼。有時還找不到,現在發現部落格可以更方便查詢知識點,所以用部落格做筆記吧。也有助於大家學習、交流,先寫一些基礎的吧。 一、iOS程式常識 1. 生命週期 程式啟動時,載入xi

IOS 初級開發入門教程(三)探究應用及檢視的生命週期變化

導讀 作業系統都會根據應用的生命週期狀態來管理和處理邏輯,這一點在Android開發上現的就已經非常好了,耳熟能詳的就是應用狀態影響記憶體回收級別和活動的生命週期。同樣,在IOS上也會充分利用應用的檢視的生命週期來進行管理應用。首先,我們先知道IOS應用在程式中的五種狀