UIViewController

UIViewController的初始化

VC的初始化里很重要的一步就是对view属性的初始化,保证到达viewDidLoad的时候view属性非nil。

对于SB创建的VC,VC使用initWithCoder:进行初始化;

其他情况,VC是使用init:方法进行对象初始化,系统提供的UIViewController类init:实现过程中还会调用initWithNibName:bundle:方法完成VC的。

VC.view的初始化 - loadView

无特殊情况,视图的初始化工作,可以在viewDidLoad里完成。

-(void)loadView; // This is where subclasses should create their custom view hierarchy if they aren't using a nib. Should never be called directly.

如果子类VC不是使用nib方式定义其视图层级关系,那么应该在此自定义视图层级关系,不应直接调用。

说明: 如果是使用与VC同名的xib初始化VC.view(比如使用SB、VC自动生成的xib),一定不要重写loadView方法。如果重写了,那么xib里边的视图会失效。

如果真要在此自定义VC.view,一般的做法就是

//NSLog(@"self.view:%@", self.view);//千万不要这么干!!VC.view属性的getter会陷入loadView的死循环里。
CustomView *customView = [[CustomView alloc]initWithFrame:[UIScreen mainScreen].bounds];
//configure the customView ...
self.view =view;
@property(null_resettable, nonatomic,strong) UIView *view; // The getter first invokes [self loadView] if the view hasn't been set yet. Subclasses must call super if they override the setter or getter.
//VC中的view属性的getter如果为nil时,那么就会第一时间调loadView去初始化view。

API-loadView的说明

You should never call this method directly. The view controller calls this method when its view property is requested but is currently nil. This method loads or creates a view and assigns it to the view property.

当VC访问view属性并发现其为nil时,就会去调用loadView加载视图,此方法正是为此而创建一个view并赋值给VC.view而生的。

If the view controller has an associated nib file, this method loads the view from the nib file. A view controller has an associated nib file if the nibName property returns a non-nil value, which occurs if the view controller was instantiated from a storyboard, if you explicitly assigned it a nib file using the initWithNibName:bundle: method, or if iOS finds a nib file in the app bundle with a name based on the view controller'��s class name. If the view controller does not have an associated nib file, this method creates a plain UIView object instead.
如果VC已经跟一个nib文件关联,loadView方法会去nib文件里加载视图作为VC的view。一个VC的nibName属性非空就说明已经关联了一个nib文件,一般出现在使用StoryBoard设计VC、明确使用 initWithNibName:bundle: 去初始化VC、或者iOS在app里发现一个nib文件跟VC类同名。** 最后,如果VC没有关联任何的nib文件,那么loadView方法就会给VC.view创建一个空白的UIView对象。

If you use Interface Builder to create your views and initialize the view controller, you must not override this method.

You can override this method in order to create your views manually. If you choose to do so, assign the root view of your view hierarchy to the view property. The views you create should be unique instances and should not be shared with any other view controller object. Your custom implementation of this method should not call super.

If you want to perform any additional initialization of your views, do so in the viewDidLoad method.

如果你使用IB来创建你的视图并用来初始化你的VC,切勿重载此方法。

你可以通过重载此方法去手动创建你的视图。如果你这么干了,请把创建的视图的根视图赋值给VC.view。创建出来的视图应该是个独一无二的实例,且请勿与其他VC对象共享之。里边也不应该调用父类的这个方法。

如果你想对视图做一些额外的初始化工作,请在viewDidLoad方法里完成。

总之:无特殊情况,视图的初始化工作,可以在viewDidLoad里完成。

UIViewController的生命周期

vcA 从出现到push到vcB:

 1. A viewDidLoad  
 2. A viewWillAppear  
 3. A viewDidAppear  
 4. B viewDidLoad  
 5. A viewWillDisappear  
 6. B viewWillAppear  
 7. A viewDidDisappear
 8. B viewDidAppear

vcB pop回 vcA,则:

1. B viewWillDisappear  
2. A viewWillAppear  
3. B viewDidDisappear  
4. A viewDidAppear  
5. B dealloc//A视图已经出现之后,vcB对象销毁。

值得注意的是,B视图pop回来的时候前一个视图控制器vcB在A视图viewDidAppear后才被销毁。

再见,viewDidUnload方法

从 iOS 6 开始,viewDidUnload 方法被废弃掉了,应用收到 memory warning 时也不会再调用 viewDidUnload 方法。

在 iOS6 时,当系统发出 MemoryWarning 时,系统会自动回收 bitmap 类。但是不回收 UIView 和 CALayer 类。这样即回收了大部分内

存,又能在需要 bitmap 类时,通过调用 UIView 的 drawRect: 方法重建。如果贸贸然把self.view = nil;那么下次需要用到该视图时就需要重新做loadView的活了,而且还会触发viewDidLoad等等一系列创建视图的方法。

摘自:
唐巧的技术博客

关于self.view.frame在viewDidLoad与viewWillApear的差异

基本是因为vc对xib文件的加载是原封不动的尺寸加载这种方式引起的,但是最后都能正确显示是因为self.view的autoresize = W+H,这个自动调整尺寸的属性让frame最后显示时根据屏幕尺寸做了自动调整。

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

推荐阅读更多精彩内容