viewcontroller资源管理

viewcontroller在app的硬软件资源管理中占据着重要的作用,它的设计哲学在于将app切分成多个部分,只实例化现时需要的那部分,而viewcontroller自身也不停地操纵着它所管理的资源。比如viewcontroller的view树只有在view被访问到的时候才会实例化,严格来说只有在view显示在屏幕上的时候才会被使用到。当多个viewcontroller同时被push到navigation stack中的时候,只有最顶部的viewcontroller内容可见,即只有其view被使用到。同样地,如果一个viewcontroller当前并不是被navigation controller所呈现,则不必实例化navigation item。通过这种延迟加载资源的方式,view controller得以在最小的资源负担运行。

viewcontroller管理UI

view被使用到的时候,如果其当前并不在内存中,则viewcontroller会将view加载进内存并将其赋值给其view属性,过程如下:

1 viewcontroller调用load view方法,在loadView默认实现中,若其与storyboard关联,则从storyboard中加载view,否则创建空的view,然后将赋值view属性

2 调用viewdidload方法以进行额外的工作

加载view进内存的调用过程

注:其实可以试试viewcontroller在关联了storyboard的情况下,再重载loadView会发生什么情况,虽然只有在手动创建View的时候才会调用用户自己重载过的loadView,否则会直接从Storyboard 中加载view

如果通过完全通过编程方式来创建View,则需要注意的是由于viewcontroller的view会由于各种原因被resize,所以在loadview的过程中即使将创建的root view frame设置为window的frame值,最终呈现效果可能会根据场景的不同而不同,详见附注1

viewcontroller管理内存

需要进行内存分配及释放的地方有如下场景:init场景,loadView, viewDidload, didReceiveMemoryWarning, dealloc,当然还有在任意场景 创建及析构自定义对象的自由。

需要注意的是,在didReceiveMemoryWarning可以 释放对view的引用(听起来好可怕),代码示例如下

内存不足时可以释放view

以及,dealloc需要做真正需要在最后一刻释放及清理的操作,同时实例变量太属性不需要显式释放,因为它们会自动被释放 

附注1  view controller的view resize

view controller可以管理自己的view,但大多数情况下view的frame是由view controller被呈现的方式所决定的。比如状态栏存在时,view的frame会被改变。

--- window设置rootviewcontroller的view的frame, 其设置的frame的实际值受如下因素影响:

1 window的frame本身的大小

2 状态栏是否可见

3 状态栏是否在呈现临时的额外信息(比如来电信息)

4 UI的orientation

5 rootviewcontroller的wantsFullScreenLayout属性

若要显示状态栏,view会缩小以不被状态栏覆盖,因为如果状态栏是不透明的话,用户是无法与被其覆盖的内容交互的。若状态栏是透明的,可以设置viewcontroller的wantsFullScreenLayout属性为YES以允许view全屏显示。此时状态栏是在view的上面显示的。

由于用户无法与透明状态栏(或者透明导航条和工具条)下面的内容交互,所以在view全屏时将内容置于scrollview之中是很有必要的。导航条会自动添加一个scroll content inset到你的scroll view(假设这是viewcontroller的根view)以考虑到导航条的高度,否则必须手动设置scroll view的contentinset。

--- 容器设置子view的frame

viewcontroller为其他容器viewcontroller的孩子的时候,子viewcontroller的view会被当做子view添加进view树中,并得到相应的frame: 比如tab view controller在底部维护tab bar,剩余的空间作为子View的frame,navigation view controller会在屏幕顶部保留一个导航条的位置,剩余位置使用当前可见子view controller的View填充

--- 被呈现的viewcontroller会受限于呈现viewcontroller的frame

--- view controller在view layout中的发生作用的步骤如下:1 view controller的view resize到新size 2 若未使用Autolayout,views们会根据autoresizing mask进行Resize  3 view controller的 viewwilllayoutsubviews方法被调用  4 view的layoutsubviews方法被调用,如果使用auto layout,则通过如下步骤更新layout限制:a 调用view controller的updateviewconstraints方法 b viewcontroller的updateviewconstraits方法调用view的updateConstraints方法 c layout constraints更新之后,会计算新的layout并重置各view的位置  5 view controller的viewdidlayoutsubviews方法调用

想知道,不使用autolayout的时候,会不会有viewwilllayout方法被调用?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容

  • /* UIViewController is a generic controller base class th...
    DanDanC阅读 1,789评论 0 2
  • 7、不使用IB是,下面这样做有什么问题? 6、请说说Layer和View的关系,以及你是如何使用它们的。 1.首先...
    AlanGe阅读 650评论 0 1
  • iOS 实战开发课程笔记 本贴旨在作为对极客班 《iOS 开发实战》第五期期课程视频重新学习的笔记。目标是建立一个...
    黄穆斌阅读 2,981评论 12 57
  • 1.OC里用到集合类是什么? 基本类型为:NSArray,NSSet以及NSDictionary 可变类型为:NS...
    轻皱眉头浅忧思阅读 1,354评论 0 3
  • 如果给女孩子写纸条算是写作诗歌的话,我已经写作了十个年头。这期间我没有投过任何稿,除了在自己编校刊的时候救过急以外...
    五花王阅读 897评论 0 2