真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

ios開發(fā)生命周期,iOS開發(fā)生命周期

iOS 控制器生命周期

1,單個(gè)viewController的生命周期

成都創(chuàng)新互聯(lián)公司"三網(wǎng)合一"的企業(yè)建站思路。企業(yè)可建設(shè)擁有電腦版、微信版、手機(jī)版的企業(yè)網(wǎng)站。實(shí)現(xiàn)跨屏營(yíng)銷,產(chǎn)品發(fā)布一步更新,電腦網(wǎng)絡(luò)+移動(dòng)網(wǎng)絡(luò)一網(wǎng)打盡,滿足企業(yè)的營(yíng)銷需求!成都創(chuàng)新互聯(lián)公司具備承接各種類型的成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、外貿(mào)網(wǎng)站建設(shè)項(xiàng)目的能力。經(jīng)過十載的努力的開拓,為不同行業(yè)的企事業(yè)單位提供了優(yōu)質(zhì)的服務(wù),并獲得了客戶的一致好評(píng)。

①,initWithCoder:(NSCoder *)aDecoder:(如果使用storyboard或者xib)

②,loadView:加載view

③,viewDidLoad:view加載完畢

④,viewWillAppear:控制器的view將要顯示

⑤,viewWillLayoutSubviews:控制器的view將要布局子控件

⑥,viewDidLayoutSubviews:控制器的view布局子控件完成

這期間系統(tǒng)可能會(huì)多次調(diào)用viewWillLayoutSubviews 、 viewDidLayoutSubviews 倆個(gè)方法

⑦,viewDidAppear:控制器的view完全顯示

⑧,viewWillDisappear:控制器的view即將消失的時(shí)候

這期間系統(tǒng)也會(huì)調(diào)用viewWillLayoutSubviews 、viewDidLayoutSubviews 兩個(gè)方法

⑨,viewDidDisappear:控制器的view完全消失的時(shí)候

⑩,didReceiveMemoryWarning(內(nèi)存滿時(shí))

當(dāng)程序發(fā)出一個(gè)內(nèi)存警告---

系統(tǒng)詢問控制器有View嗎---如果有View

系統(tǒng)詢問這個(gè)View能夠銷毀嗎----通過判斷View是否在Windown上面,如果不在,就表示可以銷毀

如果可以銷毀,就執(zhí)行viewWillUnLoad()-----對(duì)你的View進(jìn)行一次release,此時(shí)View就為nil

然后調(diào)用viewDidUnLoad()-----一般還會(huì)在這個(gè)方法里將一些不需要屬性清空

2,多個(gè)viewControllers跳轉(zhuǎn)

當(dāng)我們點(diǎn)擊push的時(shí)候首先會(huì)加載下一個(gè)界面然后才會(huì)調(diào)用界面的消失方法

initWithCoder:(NSCoder *)aDecoder:ViewController2(如果用xib創(chuàng)建的情況下)

loadView:ViewController2

viewDidLoad:ViewController2

viewWillDisappear:ViewController1將要消失

viewWillAppear:ViewController2將要出現(xiàn)

viewWillLayoutSubviewsViewController2

viewDidLayoutSubviewsViewController2

viewWillLayoutSubviews:ViewController1

viewDidLayoutSubviews:ViewController1

viewDidDisappear:ViewController1完全消失

viewDidAppear:ViewController2完全出現(xiàn)

3,相關(guān)解釋

①,loadView()

若控制器有關(guān)聯(lián)的 Nib 文件,該方法會(huì)從 Nib 文件中加載 view;如果沒有,則創(chuàng)建空白 UIView 對(duì)象。

自定義實(shí)現(xiàn)不應(yīng)該再調(diào)用父類的該方法。

②,viewDidLoad()

view 被加載到內(nèi)存后調(diào)用viewDidLoad()。

重寫該方法需要首先調(diào)用父類該方法。

該方法中可以額外初始化控件,例如添加子控件,添加約束。

該方法被調(diào)用意味著控制器有可能(并非一定)在未來會(huì)顯示。

在控制器生命周期中,該方法只會(huì)被調(diào)用一次。

③,viewWillAppear()

該方法在控制器 view 即將添加到視圖層次時(shí)以及展示 view 時(shí)所有動(dòng)畫配置前被調(diào)用。

重寫該方法需要首先調(diào)用父類該方法。

該方法中可以進(jìn)行操作即將顯示的 view,例如改變狀態(tài)欄的取向,類型。

該方法被調(diào)用意味著控制器將一定會(huì)顯示。

在控制器生命周期中,該方法可能會(huì)被多次調(diào)用。

注意:******

ViewControllerA present一個(gè)ViewControllerB,如果是iOS13 默認(rèn)UIModalPresentationAutomatic樣式,當(dāng)ViewControllerB dismiss 到 ViewControllerA的時(shí)候,不調(diào)用ViewControllerA里面的,viewWillAppear方法和viewDidAppear方法。

modalPresentationStyle設(shè)置成UIModalPresentationFullScreen的模式,會(huì)調(diào)用viewWillAppear方法和viewDidAppear方法。

④,viewWillLayoutSubviews()

該方法在通知控制器將要布局 view 的子控件時(shí)調(diào)用。

每當(dāng)視圖的 bounds 改變,view 將調(diào)整其子控件位置。

該方法可重寫以在 view 布局子控件前做出改變。

該方法的默認(rèn)實(shí)現(xiàn)為空。

該方法調(diào)用時(shí),AutoLayout 未起作用。

在控制器生命周期中,該方法可能會(huì)被多次調(diào)用。

⑤,viewDidLayoutSubviews()

該方法在通知控制器已經(jīng)布局 view 的子控件時(shí)調(diào)用。

該方法可重寫以在 view 布局子控件后做出改變。

該方法的默認(rèn)實(shí)現(xiàn)為空。

該方法調(diào)用時(shí),AutoLayout 已經(jīng)完成。

在控制器生命周期中,該方法可能會(huì)被多次調(diào)用。

⑥,viewDidAppear()

該方法在控制器 view 已經(jīng)添加到視圖層次時(shí)被調(diào)用。

重寫該方法需要首先調(diào)用父類該方法。

該方法可重寫以進(jìn)行有關(guān)正在展示的視圖操作。

在控制器生命周期中,該方法可能會(huì)被多次調(diào)用。

⑦,viewWillDisappear()

該方法在控制器 view 將要從視圖層次移除時(shí)被調(diào)用。

類似 viewWillAppear()。

該方法可重寫以提交變更,取消視圖第一響應(yīng)者狀態(tài)。

⑧,viewDidDisappear()

該方法在控制器 view 已經(jīng)從視圖層次移除時(shí)被調(diào)用。

類似 viewDidAppear()

該方法可重寫以清除或隱藏控件。

⑨,didReceiveMemoryWarning()

當(dāng)內(nèi)存預(yù)警時(shí),該方法被調(diào)用。

不能直接手動(dòng)調(diào)用該方法。

該方法可重寫以釋放資源、內(nèi)存。

⑩,deinit

控制器銷毀時(shí)(離開堆),調(diào)用該方法。

可以移除通知,調(diào)試循環(huán)測(cè)試

總結(jié):

當(dāng)屏幕旋轉(zhuǎn),view 的 bounds 改變,其內(nèi)部的子控件也需要按照約束調(diào)整為新的位置,因此也調(diào)用了 viewWillLayoutSubviews() 和 viewDidLayoutSubviews()。

ViewControllerA present一個(gè)ViewControllerB,如果是iOS13 默認(rèn)UIModalPresentationAutomatic樣式,當(dāng)ViewControllerB dismiss 到 ViewControllerA的時(shí)候,不調(diào)用ViewControllerA里面的,viewWillAppear方法和viewDidAppear方法。

modalPresentationStyle設(shè)置成UIModalPresentationFullScreen的模式,會(huì)調(diào)用viewWillAppear方法和viewDidAppear方法。

若 loadView() 沒有加載 view,viewDidLoad() 會(huì)一直調(diào)用 loadView() 加載 view,因此構(gòu)成了死循環(huán),程序即卡死。 原文

上面說的有些混亂了,下邊看一下轉(zhuǎn)場(chǎng)A viewwilldisappear,AviewDidDisappear和 B viewwillappear和viewdidappear的各種情況的出現(xiàn)順序:

Push: A-willDisappear--B-willAppear--A-didDisappear--B-didAppear

fullScreenPresent: A-willDisappear--B-willAppear--B-didAppear--A-didDisappear

OtherPresent: B-willAppear--B-didAppear(因?yàn)锳沒有消失)

TabBar: B-willAppear--A-willDisappear--A-didDisappear--B-didAppear

在每一種轉(zhuǎn)場(chǎng)下,appear 與 disappear 都有一些不一樣的順序,一定要分清楚,不能一概而論。

以下第一個(gè)出現(xiàn)的都是will,第二個(gè)都是did,will永遠(yuǎn)在did之前,因?yàn)橐粋€(gè)是將要,一個(gè)是已經(jīng)

push:abab(最正常)

fullScreenPresent:abba

otherPresent:bb(a不消失,所以不調(diào)用)

tabbar:baab

附加面試題:load和initialize的區(qū)別

******:load是只要類所在的文件被引用就會(huì)被調(diào)用,而initialize是在類或者其子類的第一個(gè)方法被調(diào)用前調(diào)用。所以如果類沒有被引用進(jìn)項(xiàng)目,就不會(huì)調(diào)用load方法,即使類文件被引用進(jìn)來,如果沒有使用,那么initialize不會(huì)被調(diào)用。

調(diào)用方式

1、load是根據(jù)函數(shù)地址直接調(diào)用

2、initialize是通過objc_msgSend調(diào)用

調(diào)用時(shí)刻

1、load是runtime加載類、分類的時(shí)候調(diào)用(只會(huì)調(diào)用一次)

2、initialize是類第一次接收到消息的時(shí)候調(diào)用, 每一個(gè)類只會(huì)initialize一次(如果子類沒有實(shí)現(xiàn)initialize方法, 會(huì)調(diào)用父類的initialize方法, 所以父類的initialize方法可能會(huì)調(diào)用多次)

load和initializee的調(diào)用順序

1、load:

先調(diào)用類的load, 在調(diào)用分類的load

先編譯的類, 優(yōu)先調(diào)用load, 調(diào)用子類的load之前, 會(huì)先調(diào)用父類的load

先編譯的分類, 優(yōu)先調(diào)用load

2、initialize

先初始化分類, 后初始化子類

通過消息機(jī)制調(diào)用, 當(dāng)子類沒有initialize方法時(shí), 會(huì)調(diào)用父類的initialize方法, 所以父類的initialize方法會(huì)調(diào)用多次

鏈接:

iOS 生命周期

當(dāng)我們打開 APP 時(shí),程序一般都是從 main 函數(shù)開始運(yùn)行的,那么我們先來看下 Xcode 自動(dòng)生成的 main.m 文件:

這個(gè)默認(rèn)的 iOS 程序就是從 main 函數(shù)開始執(zhí)行的,但是在 main 函數(shù)中我們其實(shí)只能看到一個(gè)方法,這個(gè)方法內(nèi)部是一個(gè)消息循環(huán)(相當(dāng)于一個(gè)死循環(huán)),因此運(yùn)行到這個(gè)方法 UIApplicationMain 之后程序不會(huì)自動(dòng)退出,而只有當(dāng)用戶手動(dòng)關(guān)閉程序這個(gè)循環(huán)才結(jié)束。我們看下這個(gè)方法定義:

這個(gè)方法有四個(gè)參數(shù):

關(guān)于返回值,即便聲明了返回值,但該函數(shù)也從不會(huì)返回。

也就是說當(dāng)執(zhí)行 UIApplicationMain 方法后這個(gè)方法會(huì)根據(jù)第三個(gè)參數(shù) principalClassName 創(chuàng)建對(duì)應(yīng)的 UIApplication 對(duì)象,這個(gè)對(duì)象會(huì)根據(jù)第四個(gè)參數(shù) delegateClassName 創(chuàng)建 AppDelegate 并指定此對(duì)象為 UIApplication 的代理;同時(shí) UIApplication 會(huì)開啟一個(gè)消息循環(huán)不斷監(jiān)聽?wèi)?yīng)用程序的各個(gè)活動(dòng),當(dāng)應(yīng)用程序生命周期發(fā)生改變 UIApplication 就會(huì)調(diào)用代理對(duì)應(yīng)的方法。

既然應(yīng)用程序 UIApplication 是通過代理和外部交互的,那么我們就有必要清楚 AppDelegate 的操作細(xì)節(jié),在這個(gè)類中定義了生命周期的各個(gè)事件的執(zhí)行方法:

簡(jiǎn)要說下我們不同的操作,程序運(yùn)行結(jié)果:

通過簡(jiǎn)單的操作,大家對(duì)整個(gè)運(yùn)行周期有了個(gè)大概的了解。再附上一張圖,讓大家有個(gè)清晰的認(rèn)識(shí):

總覽 UIViewController 生命周期:

下面創(chuàng)建了一個(gè) TestViewController 類,了解下整個(gè)過程:

TestViewController.m:

在 ViewController.m 中:

我們?cè)趧?chuàng)建 TestViewController 實(shí)例時(shí),可以通過以下兩種方法:

我們經(jīng)常使用的是第二種創(chuàng)建方法,其實(shí)第二種方法默認(rèn)實(shí)現(xiàn)了第一種的方法,只不過兩個(gè)參數(shù)默認(rèn)傳的是 nil。

當(dāng) TestVeiwController 通過 xib 加載的時(shí)候,看下 viewDidLoad 之前發(fā)生了什么:

無 xib:

TestVeiwController 通過 storyboard 加載:

控制臺(tái)輸出:

我們可以看到通過 storyboard 實(shí)例化與 init 實(shí)例化在 loadView 方法調(diào)用之前走的是不同的方法。我們看下這幾個(gè)方法的不同:

此方法發(fā)生在 nib 加載之前。

調(diào)用此方法進(jìn)行 Controller 初始化,與 nib 加載無關(guān)。nib 的加載是懶加載,當(dāng) Controller 需要加載其視圖時(shí),才會(huì)加載此方法中指定的 nib。

可以看出該方法初始化的 Controller 不是從 nib 創(chuàng)建的。

此方法發(fā)生在 nib 加載期間。

所有 archived 對(duì)象的初始化使用此方法。nib 中存儲(chǔ)的對(duì)象就是 archived 對(duì)象,所以此方法是 nib 加載對(duì)象時(shí)使用的初始化方法。

當(dāng)從 nib 創(chuàng)建 UIViewController 時(shí)使用此方法。

此方法發(fā)生在 nib 中所有對(duì)象都已完全加載完之后。

如果 initWithCoder 是 unarchiving 開始,那此方法就是結(jié)束。

在此方法中創(chuàng)建視圖。

我們可以通過下圖來理解它的邏輯:

每次訪問 view 時(shí),就會(huì)調(diào)用 self.view 的 get 方法,在 get 方法中判斷 self.view==nil ,不為 nil 就直接返回 view,等于 nil 就去調(diào)用 loadView 方法。loadView 方法會(huì)去判斷有無指定 storyBord/Xib 文件,如果有就去加載 storyBord/Xib 描述的控制器 view,如果沒有則系統(tǒng)默認(rèn)創(chuàng)建一個(gè)空的 view,賦給 self.view。loadView 方法有可能被多次調(diào)用(每當(dāng)訪問 self.view 并且為 nil 時(shí)就會(huì)調(diào)用一次);

系統(tǒng)會(huì)自動(dòng)為我們加載 view,我們完全沒必要手動(dòng)創(chuàng)建 view。

視圖將要被展示的時(shí)候調(diào)用。

其調(diào)用的時(shí)機(jī)與視圖所在層次有關(guān)。例如我們常用的 push 與 present 操作改變了當(dāng)前視圖層次,都會(huì)觸發(fā)此方法。

1、那么 UIAlertController 也是 present 操作怎么沒有觸發(fā)呢?

因?yàn)?UIAlertController 在另一個(gè) window 上,view 在自己所在的 window 中層次并沒有改變,所以不會(huì)觸發(fā),同理在鎖屏以及進(jìn)入后臺(tái)時(shí)也不會(huì)觸發(fā)。

2、如果控制器 B 被展示在另一個(gè)控制器 A 的 popover 中,那么被展示的控制器 B 在消失后,控制器 A 并不會(huì)調(diào)用此方法。

官方原文:

例如我們使用的 addSubview 方法,如下:

AViewController.m 中:

當(dāng)我們將 BViewController 從 AViewController 中移除后,并不會(huì)觸發(fā) AViewController 的 viewWillAppear 方法。

視圖渲染完成后調(diào)用,與 viewWillAppear 配套使用。

這兩個(gè)方法發(fā)生在 viewWillAppear 與 viewDidAppear 之間。

viewWillDisappear 與 viewDidDisappear 配套使用。

兩個(gè)方法的調(diào)用時(shí)機(jī)同 viewWillAppear 和 viewDidAppear 道理相同。

這兩個(gè)方法是收到內(nèi)存警告時(shí)調(diào)用的。

在 iOS5 以及之前使用的方法,iOS6 及之后已經(jīng)廢棄。在收到內(nèi)存警告時(shí),在此方法中將 view 置為 nil;

收到內(nèi)存警告時(shí),系統(tǒng)自動(dòng)調(diào)用此方法,回收占用大量?jī)?nèi)存的視圖數(shù)據(jù)。我們一般不需要在這里做額外的操作。如果要自己處理一些額外內(nèi)存,重寫時(shí)需要調(diào)用父類方法,即 [super didReceiveMemoryWarning] 。

UIViewController 釋放時(shí)調(diào)用此方法。UIViewController 的生命周期到此結(jié)束。

當(dāng)我們重寫此方法時(shí),ARC 環(huán)境下不需要調(diào)用父類方法,MRC 環(huán)境下需要調(diào)用父類方法,即 [super dealloc] 。

本篇主要介紹了 APP 的生命周期,以及 UIViewController 的生命周期,對(duì)我們程序開發(fā)的過程有了更清晰的認(rèn)識(shí)。

參考資料:

iOS開發(fā)之生命周期

applicationDidFinishLaunching 和 didFinishLaunchingWithOptions 這兩個(gè)都是App完成啟動(dòng)的函數(shù),當(dāng)兩者都寫時(shí),執(zhí)行后者

啟動(dòng)(未運(yùn)行 - 激活) :

willFinishLaunchingWithOptions

didFinishLaunchingWithOptions

DidBecomeActive

進(jìn)入后臺(tái)(激活 - 后臺(tái)) :

WillResignActive 進(jìn)入后臺(tái)調(diào)用瞬間

DidEnterBackground 已經(jīng)完全進(jìn)入后臺(tái),iPhone回到桌面

進(jìn)入前臺(tái)(后臺(tái)/多任務(wù) - 激活) :

WillEnterForeground App激活瞬間的展示動(dòng)畫

DidBecomeActive 已經(jīng)完全進(jìn)入前臺(tái),App的畫面完全展示

進(jìn)入多任務(wù)再進(jìn)入前臺(tái)(激活 - 多任務(wù) - 激活) :

WillResignActive 激活 - 多任務(wù)

DidBecomeActive 多任務(wù) - 激活

PS 注意這種情況下,從多任務(wù)到激活狀態(tài),不會(huì)調(diào)用WillEnterForeground,因?yàn)榇藭r(shí)App是還在前臺(tái)的,雖然畫面是多任務(wù)

殺死App(多任務(wù) - 終止) :

DidEnterBackground

WillTerminate


當(dāng)前文章:ios開發(fā)生命周期,iOS開發(fā)生命周期
網(wǎng)站鏈接:http://weahome.cn/article/dsiscgo.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部