iOS initWithFrame云稚、initWithCoder、awakeFromNib的區(qū)別解析

當(dāng)我們需要自定義一個(gè)View控件時(shí)沈堡,會(huì)有 initWithFrame静陈、initWithCoder、awakeFromNib 這三個(gè)系統(tǒng)方法诞丽,關(guān)于這三個(gè)方法何時(shí)調(diào)用鲸拥,如何調(diào)用,有時(shí)候可能很多人會(huì)弄混淆僧免。

下面我會(huì)就理論結(jié)合代碼舉例來(lái)說(shuō)明一下:

1刑赶、initWithFrame

- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        NSLog(@"initWithFrame");
        [self initViews];
    }
    return self;
}

這個(gè)方法是當(dāng)控件不是從xib、storyboard中創(chuàng)建時(shí)懂衩,會(huì)調(diào)用這個(gè)方法撞叨,比如:

 XibShow *xib = [[XibShow alloc] initWithFrame:CGRectMake(0, 330, KScreenWidth, 100)];
 [self.view addSubview:xib];

這里我直接用 [XibShow alloc] initWithFrame 來(lái)創(chuàng)建控件金踪,所以,這里自定義控件內(nèi)谒所,只會(huì)走 initWithFrame 方法热康,其余兩個(gè)不會(huì)走。

2劣领、initWithCoder

- (instancetype)initWithCoder:(NSCoder *)coder
{
    self = [super initWithCoder:coder];
    if (self) {
        NSLog(@"initWithCoder");
        [self initViews];
    }
    return self;
}

當(dāng)控件是從xib姐军、storyboard中創(chuàng)建時(shí),就會(huì)調(diào)用這個(gè)方法尖淘。

概括的理解就是:你的view或cell在xib或storyboard上有體現(xiàn)奕锌,比如直接用xib創(chuàng)建的,或是拉控件關(guān)聯(lián)已有類等村生。

而且惊暴,即使我們自定義的view是純代碼,沒有xib趁桃,但我們?cè)趘c的xib里引用了辽话,效果是一樣的。

image

比如卫病,這兩種方式創(chuàng)建的自定義view油啤,只要我們有在xib或storyboard里引用過(guò),就都會(huì)執(zhí)行initWithCoder和awakeFromNib

3蟀苛、awakeFromNib

-(void)awakeFromNib{
    NSLog(@"awakeFromNib");
    [super awakeFromNib];
    [self initViews];    
}

這個(gè)方法在initWithCoder:方法后調(diào)用 益咬,順序是:initWithCoder -> awakeFromNib (下面會(huì)有代碼截圖)

  • 可以這么來(lái)理解:

一開始經(jīng)過(guò)initWithCoder創(chuàng)建出來(lái)的控件是死的,然后通過(guò)awakeFromNib來(lái)喚醒帜平,所以這會(huì)有一個(gè)先后的調(diào)用順序幽告。

下面會(huì)有一個(gè)具體的示例:

1、創(chuàng)建一個(gè)vc裆甩,在storyboard上關(guān)聯(lián)界面冗锁,在界面上新增一個(gè)view,關(guān)聯(lián)我們的自定義view:XibShow淑掌。

image

2蒿讥、在vc里,再額外用代碼新增一個(gè)自定義view控件抛腕,add到另一個(gè)位置。

image

這樣媒殉,運(yùn)行出來(lái)的結(jié)果如下:


image

image

其中:打印順序如上圖所示担敌。

可以發(fā)現(xiàn):

1、在viewDidLoad之前廷蓉,由于是storyboard上創(chuàng)建的類全封,會(huì)先執(zhí)行好马昙,且會(huì)順序走 initWithCoder、awakeFromNib兩個(gè)方法

2刹悴、到viewDidLoad之后行楞,執(zhí)行到用代碼創(chuàng)建的view,只會(huì)走 initWithFrame 方法

PS:這里還有個(gè)小細(xì)節(jié):我在storyboard上托控件創(chuàng)建的類土匀,即使我給了背景色子房,但執(zhí)行出來(lái),還是以自定義view本身的背景色為準(zhǔn)就轧。

(可以看上圖证杭,開始設(shè)的灰色,但運(yùn)行出來(lái)還是紅色)

最后總結(jié):

1妒御、initWithFrame只適用純代碼創(chuàng)建時(shí)調(diào)用解愤,不涉及xib或storyboard。

2乎莉、initWithCoder送讲、awakeFromNib是從xib、storyboard中創(chuàng)建時(shí)會(huì)調(diào)用惋啃。

3哼鬓、所以一般來(lái)說(shuō),為了安全起見肥橙,初始化控件的代碼我們寫在一個(gè)方法里面(類似我上面的initViews方法)魄宏,然后我們分別在initWithFrame和initWithCoder中都調(diào)用一下,這樣就保證了無(wú)論你是通過(guò)什么方式創(chuàng)建的控件存筏,代碼都能起到作用宠互。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市椭坚,隨后出現(xiàn)的幾起案子予跌,更是在濱河造成了極大的恐慌,老刑警劉巖善茎,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件券册,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡垂涯,警方通過(guò)查閱死者的電腦和手機(jī)烁焙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)耕赘,“玉大人骄蝇,你說(shuō)我怎么就攤上這事〔俾猓” “怎么了九火?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵赚窃,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我岔激,道長(zhǎng)勒极,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任虑鼎,我火速辦了婚禮辱匿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘震叙。我一直安慰自己掀鹅,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布媒楼。 她就那樣靜靜地躺著乐尊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪划址。 梳的紋絲不亂的頭發(fā)上扔嵌,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音夺颤,去河邊找鬼痢缎。 笑死,一個(gè)胖子當(dāng)著我的面吹牛世澜,可吹牛的內(nèi)容都是我干的独旷。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼寥裂,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼嵌洼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起封恰,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤麻养,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后诺舔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鳖昌,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年低飒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了许昨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡褥赊,死狀恐怖车要,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情崭倘,我是刑警寧澤翼岁,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站司光,受9級(jí)特大地震影響琅坡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜残家,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一榆俺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧坞淮,春花似錦茴晋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至啡直,卻和暖如春烁涌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背酒觅。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工撮执, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人舷丹。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓抒钱,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親颜凯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子谋币,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容