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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

长路漫漫,唯剑作伴--loadView、viewDidLoad及viewDidUnload的关系

發(fā)布時間:2023/12/10 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 长路漫漫,唯剑作伴--loadView、viewDidLoad及viewDidUnload的关系 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、loadView

  • 什么時候被調用?

    • 每次訪問UIViewController的view(比如controller.view、self.view)而且view為nil,loadView方法就會被調用。
  • 有什么作用?

    • loadView方法是用來負責創(chuàng)建UIViewController的view
  • 默認實現(xiàn)是怎樣的?

  • 它會先去查找與UIViewController相關聯(lián)的xib文件,通過加載xib文件來創(chuàng)建UIViewController的view

    • 如果在初始化UIViewController指定了xib文件名,就會根據(jù)傳入的xib文件名加載對應的xib文件 [[MJViewController alloc] initWithNibName:@"MJViewController" bundle:nil];
    • 如果沒有明顯地傳xib文件名,就會加載跟UIViewController同名的xib文件 [[MJViewController alloc] init]; // 加載MJViewController.xib
  • 如果沒有找到相關聯(lián)的xib文件,就會創(chuàng)建一個空白的UIView,然后賦值給UIViewController的view屬性,大致如下

    self.view = [[[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] autorelease];

    ?

  • 怎樣正確使用這個方法?

  • 大家都知道UIViewController的view可以通過xib文件來創(chuàng)建,但是在某些情況下,xib不是那么地靈活,所以有時候我們想通過代碼來創(chuàng)建UIView,比如: self.view = [[[UIWebView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] autorelease];

    ?

  • 如果想通過代碼來創(chuàng)建UIViewController的view,就要重寫loadView方法,并且不需要調用[super loadView],因為在第3點里面已經(jīng)提到:若沒有xib文件,[super loadView]默認會創(chuàng)建一個空白的UIView。我們既然要通過代碼來自定義UIView,那么就沒必要事先創(chuàng)建一個空白的UIView,以節(jié)省不必要的開銷。正確的做法應該是這樣: - (void)loadView { self.view = [[[UIWebView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] autorelease]; }

    ?

  • 不需要調用[super loadView],你調用了也不會出錯,只是造成了一些不必要的開銷。
  • 總結一句話,蘋果設計這個方法就是給我們自定義UIViewController的view用的
  • 二、viewDidLoad

  • 什么時候被調用?

    • 不過你是通過xib文件還是重寫loadView創(chuàng)建UIViewController的view,在view創(chuàng)建完畢后,最終都會調用viewDidLoad方法
  • 有什么作用?

    • 一般我們會在這里做界面上的初始化操作,比如往view中添加一些子視圖、從數(shù)據(jù)庫或者網(wǎng)絡加載模型數(shù)據(jù)裝配到子視圖中。
  • 三、viewDidUnload

  • 什么時候被調用? 

    • ios設備的內存是極其有限的,如果應用程序占用的內存過多的話,系統(tǒng)就會對應用程序發(fā)出內存警告。UIViewController就會收到didReceiveMemoryWarning消息。didReceiveMemoryWarning方法的默認實現(xiàn)是:如果當前UIViewController的view不在應用程序的視圖層次結構(View Hierarchy)中,即view的superview為nil的時候,就會將view釋放,并且調用viewDidUnload方法
  • 有什么作用?

    • 上面說到,發(fā)出內存警告且view被釋放的時候就會調用viewDidUnload方法,所以一般在釋放資源,主要是釋放界面元素相關的資源,將相關的實例都賦值為nil - (void)viewDidUnload { [super viewDidUnload]; self.name = nil; self.pwd = nil; }
  • dealloc也是用來釋放資源的,那跟viewDidUnload有什么關系?

    • 當發(fā)出內存警告調用viewDidUnload方法時,只是釋放了view,并沒有釋放UIViewController,所以并不會調用dealloc方法。即viewDidUnload和dealloc方法并沒有任何關系,dealloc方法只會在UIViewController被釋放的時候調用
  • ?四、三個方法的關系

    • 第一次訪問UIViewController的view時,view為nil,然后就會調用loadView方法創(chuàng)建view

    • view創(chuàng)建完畢后會調用viewDidLoad方法進行界面元素的初始化

    • 當內存警告時,系統(tǒng)可能會釋放UIViewController的view,將view賦值為nil,并且調用viewDidUnload方法

    • 當再次訪問UIViewController的view時,view已經(jīng)在3中被賦值為nil,所以又會調用loadView方法重新創(chuàng)建view

    • view被重新創(chuàng)建完畢后,還是會調用viewDidLoad方法進行界面元素的初始化

    ?

    轉載于:https://www.cnblogs.com/zhuyiios/p/6674659.html

    總結

    以上是生活随笔為你收集整理的长路漫漫,唯剑作伴--loadView、viewDidLoad及viewDidUnload的关系的全部內容,希望文章能夠幫你解決所遇到的問題。

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