UIView的生命周期

將相關代碼添加打印献丑。

- (instancetype)init{
    if (self = [super init]) {
        NSLog(@"%s",__func__);
    }
    return self;
}

//通過代碼創(chuàng)建控件就會調用這個方法
- (instancetype)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        NSLog(@"%s",__func__);
    }
    return self;
}

//通過storyboared或者xib中創(chuàng)建控件就會調用這個方法
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
    if (self = [super initWithCoder:aDecoder]) {
        NSLog(@"%s",__func__);
    }
    return self;
}

- (void)awakeFromNib {
    [super awakeFromNib];
    NSLog(@"%s",__func__);
}

//如果在initWithFrame中添加子視圖會調用兩次
- (void)layoutSubviews{
    [super layoutSubviews];
        NSLog(@"%s",__func__);
}

- (void)didAddSubview:(UIView *)subview{
    [super didAddSubview:subview];
        NSLog(@"%s",__func__);
}

- (void)willRemoveSubview:(UIView *)subview{
    [super willRemoveSubview:subview];
        NSLog(@"%s",__func__);
}

- (void)willMoveToSuperview:(nullable UIView *)newSuperview{
    [super willMoveToSuperview:newSuperview];
        NSLog(@"%s",__func__);
}

- (void)didMoveToSuperview{
    [super didMoveToSuperview];
        NSLog(@"%s",__func__);
}

- (void)willMoveToWindow:(nullable UIWindow *)newWindow{
    [super willMoveToWindow:newWindow];
        NSLog(@"%s",__func__);
}

- (void)didMoveToWindow{
    [super didMoveToWindow];
        NSLog(@"%s",__func__);
}

- (void)removeFromSuperview{
    [super removeFromSuperview];
        NSLog(@"%s",__func__);
}

- (void)dealloc{
        NSLog(@"%s",__func__);
}
當創(chuàng)建view時
2017-11-06 10:35:12.347153+0800 IOSLife[7587:2353869] -[MyView willMoveToSuperview:]
2017-11-06 10:35:12.347312+0800 IOSLife[7587:2353869] -[MyView didMoveToSuperview]
2017-11-06 10:35:12.353483+0800 IOSLife[7587:2353869] -[MyView willMoveToWindow:]
2017-11-06 10:35:12.353644+0800 IOSLife[7587:2353869] -[MyView didMoveToWindow]
2017-11-06 10:35:12.363861+0800 IOSLife[7587:2353869] -[MyView layoutSubviews]
2017-11-06 10:35:12.655946+0800 IOSLife[7607:2356750] -[MyView drawRect:]

當view銷毀時
2017-11-06 10:41:28.152448+0800 IOSLife[7607:2356750] -[MyView willMoveToWindow:]
2017-11-06 10:41:28.152693+0800 IOSLife[7607:2356750] -[MyView didMoveToWindow]
2017-11-06 10:41:28.155160+0800 IOSLife[7607:2356750] -[MyView willMoveToSuperview:]
2017-11-06 10:41:28.155281+0800 IOSLife[7607:2356750] -[MyView didMoveToSuperview]
2017-11-06 10:41:28.155336+0800 IOSLife[7607:2356750] -[MyView removeFromSuperview]
2017-11-06 10:41:28.155399+0800 IOSLife[7607:2356750] -[MyView dealloc]

可以看出上面方法中只會執(zhí)行一次的方法有removeFromSuperview诫硕、dealloc兩個方法(layoutSubviews在子視圖布局變動時會多次調用)溺职,所以可以在這兩個方法中執(zhí)行釋放內存等操作(e.g:移除觀察者姜贡,定時器等)冯吓。

給view添加子視圖時
2017-11-06 10:45:47.749310+0800 IOSLife[7614:2358053] -[MyView didAddSubview:]
2017-11-06 10:45:47.750111+0800 IOSLife[7614:2358053] -[MyView layoutSubviews]

didAddSubview:willRemoveSubview:需要有子視圖才能執(zhí)行儡率。

此時再銷毀該view
2017-11-06 10:46:28.022473+0800 IOSLife[7617:2358497] -[MyView willMoveToSuperview:]
2017-11-06 10:46:28.022643+0800 IOSLife[7617:2358497] -[MyView didMoveToSuperview]
2017-11-06 10:46:28.031533+0800 IOSLife[7617:2358497] -[MyView willMoveToWindow:]
2017-11-06 10:46:28.031738+0800 IOSLife[7617:2358497] -[MyView didMoveToWindow]
2017-11-06 10:46:28.036048+0800 IOSLife[7617:2358497] -[MyView layoutSubviews]
2017-11-06 10:46:28.719103+0800 IOSLife[7617:2358497] -[MyView didAddSubview:]
2017-11-06 10:46:28.719873+0800 IOSLife[7617:2358497] -[MyView layoutSubviews]
2017-11-06 10:46:30.529769+0800 IOSLife[7617:2358497] -[MyView willMoveToWindow:]
2017-11-06 10:46:30.530059+0800 IOSLife[7617:2358497] -[MyView didMoveToWindow]
2017-11-06 10:46:30.532931+0800 IOSLife[7617:2358497] -[MyView willMoveToSuperview:]
2017-11-06 10:46:30.533055+0800 IOSLife[7617:2358497] -[MyView didMoveToSuperview]
2017-11-06 10:46:30.533112+0800 IOSLife[7617:2358497] -[MyView removeFromSuperview]
2017-11-06 10:46:30.533183+0800 IOSLife[7617:2358497] -[MyView dealloc]
2017-11-06 10:46:30.533256+0800 IOSLife[7617:2358497] -[MyView willRemoveSubview:]

willRemoveSubview是在dealloc后面執(zhí)行的。如果有多個子視圖胖喳,willRemoveSubview會循環(huán)執(zhí)行泡躯,直到移除所有子視圖。

注意:

  • - (void)willMoveToSuperview:(nullable UIView *)newSuperview;- (void)willMoveToWindow:(nullable UIWindow *)newWindow;這倆個方法可以根據(jù)參數(shù)判斷丽焊,nil則為銷毀较剃,否則為創(chuàng)建;
  • - (void)didMoveToSuperview;- (void)didMoveToWindow;可以根據(jù)self.superview判斷技健,nil則為銷毀写穴,否則為創(chuàng)建。
  • 如果在initWithFrame中有view的初始化相關操作雌贱,layoutSubviews會調用兩次确垫。layoutSubviews只進行布局相關處理,不能有view初始化操作(當子視圖布局改變時會調用帽芽,能多次調用)删掀,下面是layoutSubviews的觸發(fā)條件:
    1、init初始化不會觸發(fā)layoutSubviews,但是是用initWithFrame進行初始化時导街,當rect的值不為CGRectZero時,也會觸發(fā)披泪。
    2、addSubview會觸發(fā)layoutSubviews搬瑰。
    3款票、設置view的Frame會觸發(fā)layoutSubviews控硼,當然前提是frame的值設置前后發(fā)生了變化。
    4艾少、滾動一個UIScrollView會觸發(fā)layoutSubviews卡乾。
    5、旋轉Screen會觸發(fā)父UIView上的layoutSubviews缚够。
    6幔妨、改變一個UIView大小的時候也會觸發(fā)父UIView上的layoutSubviews
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末谍椅,一起剝皮案震驚了整個濱河市误堡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌雏吭,老刑警劉巖锁施,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異杖们,居然都是意外死亡悉抵,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門摘完,熙熙樓的掌柜王于貴愁眉苦臉地迎上來姥饰,“玉大人,你說我怎么就攤上這事描焰∠狈瘢” “怎么了栅螟?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵荆秦,是天一觀的道長。 經常有香客問我力图,道長步绸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任吃媒,我火速辦了婚禮瓤介,結果婚禮上,老公的妹妹穿的比我還像新娘赘那。我一直安慰自己刑桑,他們只是感情好,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布募舟。 她就那樣靜靜地躺著祠斧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拱礁。 梳的紋絲不亂的頭發(fā)上琢锋,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天辕漂,我揣著相機與錄音,去河邊找鬼吴超。 笑死钉嘹,一個胖子當著我的面吹牛,可吹牛的內容都是我干的鲸阻。 我是一名探鬼主播跋涣,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼赘娄!你這毒婦竟也來了仆潮?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤遣臼,失蹤者是張志新(化名)和其女友劉穎性置,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體揍堰,經...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡鹏浅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了屏歹。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片隐砸。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蝙眶,靈堂內的尸體忽然破棺而出季希,到底是詐尸還是另有隱情,我是刑警寧澤幽纷,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布式塌,位于F島的核電站,受9級特大地震影響友浸,放射性物質發(fā)生泄漏峰尝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一收恢、第九天 我趴在偏房一處隱蔽的房頂上張望武学。 院中可真熱鬧,春花似錦伦意、人聲如沸火窒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽熏矿。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間曲掰,已是汗流浹背疾捍。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留栏妖,地道東北人乱豆。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像吊趾,于是被迫代替她去往敵國和親宛裕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內容