控制器的声明周期

ViewController的初始化

  • 从Storyboards中加载的时候,会调用initWithCode,如果不存在则调用init。之后对里面的每个对象调用awakeFromNib方法
// StoryBoard加载的控制器  会调用改方法
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
    if (self = [super initWithCoder:aDecoder]) {

    }
    return self;
}
// XIB 加载控制器调用该方法
- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    if ([super initWithNibName:nibNameOrNil bundle:nibNameOrNil]) {

    }
    return self;
}

ViewController查找与其关联的view,其顺序是:

  • 先判断子类是否重写了loadView,如果有直接调用。之后调viewDidLoad完成View的加载。
// 通常自定义View的时候使用
- (void)loadView
{
    self.view = [[UIImageView alloc] init];
}
  • 如果是外部通过调用initWithNibName:bundle指定nib文件名的话,ViewController记载此nib来创建View。
  • 如果initWithNibName:bundle的name参数为nil,则ViewController会通过以下两个步骤找到与其关联的nib。

ViewController的卸载View的步骤:

  • 系统发出内存警告或者ViewController本身调用导致didReceiveMemoryWarning被调用
  • 如果此时view没有被加入到任何视图树上,则调用viewWillUnload之后释放View
  • 调用viewDidUnload

注意:

  • 如果viewController从创建到销毁期间都没有内存警告,那么这两个函数将始终不会被调用。
  • iOS6已将viewWillUnload和viewDidUnload废弃,原因是UIKit在内存警告的时候已经不会自动释放无用的视图。

声明周期方法

/**
 *  从nib载入视图 ,通常这一步不需要去干涉。除非你没有使用xib文件创建视图
 */
- (void)loadView
{
    [super loadView];
    XMGFunc;
}
/**
 *  1 init函数 初始化对象
 */
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
    if (self = [super initWithCoder:aDecoder]) {
        XMGFunc;
    }
    return self;
}
/**
 *  视图载入完成,可以进行自定义数据以及动态创建其他控件
 */
- (void)viewDidLoad {
    [super viewDidLoad];
    XMGFunc;
    self.title = @"MainVC";
}
/**
 *  视图将出现在屏幕之前,马上这个视图就会被展现在屏幕上了,每次视图消失再出现都会再次调用,通常我们会利用这个方法,对即将显示的视图做进一步的设置。例如,我们可以利用这个方法来设置设备不同方向时该如何显示。在视图间切换时,并不会再次载入viewDidLoad方法,所以如果在调入视图时,需要对数据做更新,就只能在这个方法内实现了。
 */
- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    XMGFunc;
}
/**
 *  视图已在屏幕上渲染完成,有时候,由于一些特殊的原因,我们不能在viewWillApper方法里,对视图进行更新。那么可以重写这个方法,在这里对正在显示的视图进行进一步的设置
 */
- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    XMGFunc;

}
/**
 *  完成对子视图布局
 */
- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    XMGFunc;

}
/**
 *  将要要对子视图进行布局
 */
- (void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];
    XMGFunc;

}
/**
 *  在loadView之前的工作放在这里
 */
- (void)awakeFromNib
{
    XMGFunc;
}
/**
 *  视图将被从屏幕上移除之前执行,在视图变换时,当前视图在即将被移除、或者被覆盖时,会调用这个方法进行一些善后的处理和设置。
 */
- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    XMGFunc;
}
/**
 *  视图已经被从屏幕上移除,用户看不到这个视图了,我们可以重写这个方法,对已经消失,或者被覆盖,或者已经隐藏了的视图做一些其他操作。
 

 */
- (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];
}
/**
 *  当程序收到内存警告的时候,会调用每一个ViewController的didReceiveMemoryWarning方法,我们需要做出相应,释放程序中暂时不需要的资源;通常都会重写该方法,但记得重写的时候要调用super的该方法。
    iOS3.0 - iOS6.0期间,didReceiveMemoryWarning方法会判断当前ViewController的view是否显示在window上,如果没有显示在window上,则didReceiveMemoryWarning会自动将ViewController的view以及其所有子view全部销毁,然后调用View Controller的viewDidUnload方法。但是从iOS6.0开始,viewDidUnload和viewWillUnload这两个方法已被废除,收到low-memory时系统不会释放view,而只是释放controller的resource。
 */
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    XMGFunc;
    //当前iOS系统的版本号
    float ver = [[[UIDevice currentDevice] systemVersion] floatValue];
    if (ver >= 6.0f) {
        //判断视图是否被装载进内存,并且是否为当前视图
        if (self.isViewLoaded && !self.view.window) {
            //将self.view置为nil,确保调用该viewController时,loadView和viewDidLoad再次调用
            self.view = nil;//确保下次重新加载
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容