日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iOS点滴- ViewController详解

發布時間:2025/5/22 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS点滴- ViewController详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、生命周期

當一個視圖控制器被創建,并在屏幕上顯示的時候。?代碼的執行順序
1、?alloc????????????????????????????? 創建對象,分配空間
2、init?(initWithNibName)  初始化對象,初始化數據
3、loadView        ? 從nib載入視圖?,通常這一步不需要去干涉。除非你沒有使用xib文件創建視圖
4、viewDidLoad       載入完成,可以進行自定義數據以及動態創建其他控件
5、viewWillAppear??????????????? 視圖將出現在屏幕之前,馬上這個視圖就會被展現在屏幕上了
6、viewDidAppear     ? 視圖已在屏幕上渲染完成當一個視圖被移除屏幕并且銷毀的時候的執行順序,這個順序差不多和上面的相反
1、viewWillDisappear????????????視圖將被從屏幕上移除之前執行
2、viewDidDisappear     視圖已經被從屏幕上移除,用戶看不到這個視圖了
3、dealloc??????????????????????????? 視圖被銷毀,此處需要對你在init和viewDidLoad中創建的對象進行釋放

關于 viewDidUnload?:在發生內存警告的時候如果本視圖不是當前屏幕上正在顯示的視圖的話,? viewDidUnload將會被執行,本視圖的所有子視圖將被銷毀,以釋放內存,此時開發者需要手動對viewLoad、viewDidLoad中創建 的對象釋放內存。?因為當這個視圖再次顯示在屏幕上的時候,viewLoad、viewDidLoad?再次被調用,以便再次構造視圖。

二、view的加載過程

文字說明在表述流程的時候總是很費力的,我又找到了如下的兩張圖

跟隨如下文字理解viewController對view加載過程:

1?先判斷子類是否重寫了loadView,如果有直接調用。之后調viewDidLoad完成View的加載。

2?如果是外部通過調用initWithNibName:bundle指定nib文件名的話,ViewController記載此nib來創建View。

3?如果initWithNibName:bundle的name參數為nil,則ViewController會通過以下兩個步驟找到與其關聯的nib。

A?如果類名包含Controller,例如ViewController的類名是MyViewController,則查找是否存在MyView.nib;

B?找跟ViewController類名一樣的文件,例如MyViewController,則查找是否存在MyViewController.nib。

4??如果子類沒有重寫的loadView,則ViewController會從StroyBoards中找或者調用其默認的loadView,默認的loadView返回一個空白的UIView對象。

注意第一 步,ViewController是判斷子類是否重寫了loadView,而不是判斷調用子類的loadView之后 ViewController的View是否為空。就是說,如果子類重寫了loadView的話,不管子類在loadView里面能否獲取到 View,ViewController都會直接調viewDidLoad完成View的加載。

三、view卸載過程圖

跟隨以下文字理解卸載過程:

1?系統發出警告或者ViewController本身調用導致didReceiveMemoryWarning被調用

2?調用viewWillUnload之后釋放View

3?調用viewDidUnload

四、模擬器的調用順序

我構架了這樣一個環境,在該環境中有兩個viewController,姑且命名為A和B,tag分別為1和2,A控制程序啟動的時候即加載的界面,在A中放一個按鈕,按下后會通過segue來調用到界面B;B?中頁放一個按鈕,通過執行

[self?dismissModalViewControllerAnimated:YES];

來返回界面A

然后檢測所有的函數調用,依次如下

加載A的時候依次調用

?

1?initWithCoder

1?loadView?//如果說你進行了重寫,會在這里調用,這一步可以參考下文

1?viewDidLoad

1?viewWillAppear

1?viewWillLayoutSubviews

1?viewDidLayoutSubviews

1?viewDidAppear

?

切換至B的時候依次調用

?

2?initWithCoder?????????????//先將2初始化

1?prepareForSegue???????//調用1的準備過度的函數,所以在該函數中可以對界面B的一些相關屬性進行賦值

2?loadView????//如果這里進行了重寫

2?viewDidLoad??????????????//2界面加載

1?viewWillDisappear

2?viewWillAppear

2?viewWillLayoutSubviews

2?viewDidLayoutSubviews

2?viewDidAppear

1?viewDidDisappear

?

從B切換回A的時候依次調用

?

2?viewWillDisappear

1?viewWillAppear

1?viewDidAppear

2?viewDidDisappear

2?dealloc

?

順序總結下來加載依次為:加載?-?顯示?-?布局

完成順序依次為:完成布局?-?完成顯示??-?完成加載

?

小注:-(void)loadView;函數如果重寫,下面是一個可能的demo

?

-(void)loadView

{

???CGRect?applicationFrame?=?[[UIScreenmainScreen]?applicationFrame];

???UIView?*contentView?=?[[UIViewalloc]?initWithFrame:applicationFrame];

???contentView.backgroundColor?=?[UIColordarkGrayColor];

???self.view?=?contentView;

???

???UILabel?*lab?=?[[UILabelalloc]initWithFrame:CGRectMake(100,?100,?100,?100)];

???lab.text?=?@"HelloWorld";

???[self.viewaddSubview:lab];

}

?

loadView雖然返回值為空,但必須在函數體內對self.view進行賦值,否則會在建立該界面的時候收到如下的log信息:

Application?windows?are?expected?to?have?a?root?view?controller?at?the?end?of?application?launch

具體執行順序為:代碼執行了initWithCoder之后直接調用了三次loadView函數,并且沒有調用其它函數(包括viewDidLoad?、viewWillDisappear、viewWillLayoutSubviews)

疑問:

暫不清楚為什么會調用三次,我的猜測是:上述三個函數分別檢測了一遍view是否存在,發現不存在,所以各自調用了一遍viewLoad,最后發現依然不存在,所以上述三個函數分別返回了失敗,加載完成

但矛盾的地方是:為什么上述三個函數本身沒有執行到?底層到底做了什么?

?

五、view和ViewController的創建階段,關于什么時候應該干什么

1、init

Allocating?critical?data?structures?required?by?your?view?controller

不要出現創建view的代碼。良好的設計,在init里應該只有相關數據的初始化,而且這些數據都是比較關鍵的數據。init里不要掉self.view,否則會導致viewcontroller創建view。(因為view是lazyinit的)。

2、loadView

Creating?your?view?objects

只初始化view,一般用于創建比較關鍵的view如tableViewController的 tabView,UINavigationController的navgationBar,不可掉用view的getter(在掉super? loadView前),最好也不要初始化一些非關鍵的view。如果你是從nib文件中創建的viewController在這里一定要首先調用 super的loadView方法,但建議不要重載這個方法。

3、viewDidLoad?

Allocating?or?loading?data?to?be?displayed?in?your?view

這時候view已經有了,最適合創建一些附加的view和控件了。有一點需要注意的是,viewDidLoad會調用多次(viewcontroller可能多次載入view,參見圖2)。

4、viewWillAppear?這個一般在view被添加到superview之前,切換動畫之前調用。在這里可以進行一些顯示前的處理。比如鍵盤彈出,一些特殊的過程動畫(比如狀態條和navigationbar顏色)。

5、viewDidAppear?一般用于顯示后,在切換動畫后,如果有需要的操作,可以在這里加入相關代碼。

6、viewDidUnload?

Releasing?references?to?view?objects

Releasing?data?that?is?not?needed?when?your?view?is?not?displayed

這時候viewController的view已經是nil了。由于這一般發生在內存警告時,所以在這里你應該將那些不在顯示的view釋放了。比 如你在viewcontroller的view上加了一個label,而且這個label是viewcontroller的屬性,那么你要把這個屬性設置 成nil,以免占用不必要的內存,而這個label在viewDidLoad時會重新創建。

7、dealloc

Releasing?critical?data?structures?required?by?your?view?controller

六、幾點備注:

1、按結構可以對iOS的所有ViewController分成兩類:

1)、主要用于展示內容的ViewController,這種ViewController主要用于為用戶展示內容,并與用戶交互,如UITableViewController,UIViewController。

2)、用于控制和顯示其他ViewController的ViewController。這種ViewController一般都是一個 ViewController的容器。如UINavigationController,UITabbarController。它們都有一個屬 性:viewControllers。其中UINavigationController表示一種Stack式結構,push一個 ViewController或pop一次,因此后一個ViewController一般會依賴前一個ViewController。而 UITabbarController表示一個Array結構,各個ViewController是并列的。

第一種ViewController會經常被繼承,用來顯示不同的數據給用戶。而第二種很少被繼承,除非你真的需要自定義它。

?

2、當view被添加其他view中之前時,會調用viewWillAppear,而之后會調用viewDidAppear。

當view從其他view中移出之前時,會調用viewWillDisAppear,而之后會調用viewDidDisappear。

當view不在使用,而且是disappeared,受到內存警告時,那么viewController會將view釋放并將其指向nil。

?

3、由于Controller加載View時,會自動將一些View對象指向其對應的IBOutlet變量。

所以當view被卸載時我們必須在viewDidUnload將這些變量release掉,ViewController不會自動做這件事。

具體做法是將變量設置為空,(注意和dealloc中將變量release的區別)注意此時Controller的view屬性是空的。

轉載于:https://www.cnblogs.com/Free-Thinker/p/4992044.html

總結

以上是生活随笔為你收集整理的iOS点滴- ViewController详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩不卡的av| 大乳女喂男人吃奶视频 | 欧美性教育视频 | 日韩资源在线 | 五月天久久久 | 欧美一区二区久久 | 日韩福利片| 公侵犯人妻一区二区三区 | 在线播放小视频 | 精品国产无码一区二区 | 午夜日韩在线 | 中文字幕一区二区不卡 | 丁香花高清在线观看完整动漫 | 黄色片视频免费看 | 亚洲一本在线 | 另类专区亚洲 | 日本三级视频在线播放 | 日日舔夜夜操 | 蜜臀国产AV天堂久久无码蜜臀 | 综合激情在线 | 五月婷网| a黄色片| 波多野结衣视频免费在线观看 | 大肉大捧一进一出好爽视频 | 日本性久久 | 国产精品探花视频 | 精品久久蜜桃 | 欧美一区二区三区成人 | 国产哺乳奶水91在线播放 | 在线免费精品视频 | 欧美日韩色视频 | 黄色永久网站 | 99热最新网址 | 欧美福利视频在线观看 | 毛片一级片 | 婷婷二区 | 亚洲va天堂va国产va久 | 美女福利在线观看 | 性欧美长视频 | 久久亚洲成人av | 日本黄频| 少妇av片| 精品乱子伦 | 亚洲国产精品久久AV | 人人干人人干人人干 | 日本美女全裸 | 97精品在线观看 | 日韩免费看 | av在线播放中文字幕 | 国产1区在线观看 | 欧美视频一二区 | 国产精品免费一区二区三区四区 | av字幕在线 | 成人区人妻精品一区二区网站 | 色91| 日本电车痴汉 | 成人在线亚洲 | 特级毛片在线 | 日韩欧美在线一区 | 一二区在线视频 | 日本69视频| 肉丝肉足丝袜一区二区三区 | 国产欧美日韩综合精品一区二区 | 91传媒网站 | 久久精品视频播放 | 国产成人av免费看 | 中出一区二区 | 日韩视频一区二区 | 日韩在线第三页 | 无套日出白浆 | 国产午夜成人久久无码一区二区 | 日韩国产第一页 | 美女在线免费视频 | 亚洲精品一区在线 | 欧美丰满美乳xxx高潮www | 涩涩屋视频在线观看 | 久操青青| 东方av正在进入 | 一级视频毛片 | 久久短视频 | 三级在线免费 | 国产稀缺精品盗摄盗拍 | 四虎永久在线精品免费网址 | 友田真希一区二区 | 天天夜夜操| 国产特黄aaaaa毛片 | 亚洲人成人无码网www国产 | 国产片网址 | 欧美与黑人午夜性猛交久久久 | 男女乱淫视频 | 亚洲videos | 91亚洲精华 | 亚洲色图av在线 | 国产精品国产三级国产专区51区 | 污动漫网站 | 亚洲av无码一区二区乱孑伦as | 国产福利视频导航 | 超碰午夜| 四川黄色一级片 |