自定義控件初始化中常見(jiàn)的幾種錯(cuò)誤(指定構(gòu)造器和便利構(gòu)造器)
截圖:
意思是:
1.沒(méi)有添加重寫(xiě)符
override
(重寫(xiě)父類方法)2.沒(méi)有重寫(xiě)initWithCoder方法。(此方法只對(duì)應(yīng)初始化是從xib峻仇,執(zhí)行代碼只的是舒裤,未從xib初始化)
意思是:為初始化父類的init方法
意思是:必須代理初始化自己的方法
意思是:不認(rèn)識(shí)此類型的Default
意思是:禁止調(diào)用此初始化方法
意思是:屬性label沒(méi)有在父類初始化方法調(diào)用之前初始化
看到這里是不是有種崩潰的心情步脓,別著急污淋,對(duì)于OC和Swift的初始化召衔,蘋果官方給了一些很合理的解釋天吓,請(qǐng)點(diǎn)開(kāi)這里:https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Initialization.html
定義Swift初始化方法芥牌,必須遵循三條規(guī)則:
1.指定構(gòu)造器必須調(diào)用它直接父類的指定構(gòu)造器方法
2.便利構(gòu)造器必須調(diào)用同一類中定義的其他初始化方法
3.便利構(gòu)造器在最后必須調(diào)用一個(gè)指定構(gòu)造器烦味。
圖形說(shuō)明:
便利構(gòu)造器 前面加
convenience
指定構(gòu)造器什么都不用加,系統(tǒng)初始化方法 要加override
還需要注意的是:
和OC一樣壁拉,未初始化時(shí)谬俄,屬性是不被賦值的,因?yàn)槠鋬?nèi)存空間不存在
從這里我們來(lái)看Swift是怎么進(jìn)行初始化的:
1.第一階段弃理,是實(shí)例的所有屬性被初始化
2.第二階段溃论,實(shí)例的所有屬性可以再次的調(diào)整以備之后的使用
Swift的編譯器會(huì)對(duì)初始化的方法進(jìn)行安全地檢查已保證實(shí)例的初始化可以被安全正確的執(zhí)行:
1.指定構(gòu)造器必須要確保所有被類中提到的屬性在向上調(diào)用父類的指定構(gòu)造器前被初始化,之后才能將其他構(gòu)造任務(wù)移交給父類的中的構(gòu)造器痘昌。
2.指定構(gòu)造器必須先向上調(diào)用父類中的構(gòu)造器钥勋,然后才能為任意屬性賦值
3.遍歷構(gòu)造器必須線調(diào)用同一個(gè)類中的其他構(gòu)造器,然后再為屬性賦值
4.構(gòu)造器在第一個(gè)階段構(gòu)造完成之前辆苔,不能調(diào)用其他任何實(shí)例方法算灸,不能讀取實(shí)例屬性的值,self不能被引用
在這里解釋初始化所謂的第一階段:
初始化的第一個(gè)階段:
1.某個(gè)指定構(gòu)造器或便利構(gòu)造器被調(diào)用
2.完成新的實(shí)例內(nèi)存的分配驻啤,但此時(shí)內(nèi)存還沒(méi)有被初始化
3.指定構(gòu)造器確保其所在類引入的所有存儲(chǔ)型屬性都已賦值菲驴。存儲(chǔ)型屬性所屬的內(nèi)存完成初始化。
4.指定構(gòu)造器將調(diào)用父類的構(gòu)造器骑冗,完成父類屬性的初始化
5.這個(gè)調(diào)用父類構(gòu)造器的過(guò)程沿著構(gòu)造器鏈條一直往上執(zhí)行赊瞬,直到到達(dá)構(gòu)造器料條的最頂部(重復(fù)1—4步驟)
6.當(dāng)?shù)竭_(dá)了構(gòu)造器鏈條的最頂部,且已確保所有實(shí)例包含的存儲(chǔ)型屬性都已經(jīng)賦值贼涩。這個(gè)實(shí)例的內(nèi)存才會(huì)被認(rèn)為已經(jīng)完全初始化了
注意:
1巧涧。子類的便利構(gòu)造器首先會(huì)被調(diào)用,此時(shí)便利構(gòu)造器還不能修改子類的任何屬性遥倦。
2.便利構(gòu)造器會(huì)調(diào)用子類中的指定構(gòu)造器谤绳,指定構(gòu)造器(子類)要確保所有的屬性都已賦值,完成所屬內(nèi)存的初始化
3.接著會(huì)指定構(gòu)造器(子類)會(huì)調(diào)用父類中的指定構(gòu)造器,完成父類屬性所屬內(nèi)存的初始化闷供,直到達(dá)到構(gòu)造器鏈條的最頂部,所有的屬性以及內(nèi)存被完全初始化统诺,然后進(jìn)入第二階段
便利構(gòu)造器內(nèi)存未被初始化歪脏,不能修改屬性
第二階段:
1.從頂部構(gòu)造器沿著鏈條一直向下,每個(gè)構(gòu)造器鏈條中類的指定構(gòu)造器都有機(jī)會(huì)一步定制實(shí)例粮呢。構(gòu)造器此時(shí)可以訪問(wèn)self婿失,修改它的屬性并調(diào)用實(shí)例方法等等
2.最終,任意構(gòu)造器鏈條中的便利構(gòu)造器可以有機(jī)會(huì)定制實(shí)例和使用self
創(chuàng)建的錯(cuò)誤注意點(diǎn):
1.如果子類沒(méi)有定義任何指定構(gòu)造器啄寡,那么會(huì)默認(rèn)繼承所有來(lái)自父類的指定構(gòu)造器
2.指定構(gòu)造器必須調(diào)用它最近父類的指定構(gòu)造器‘
3.便利構(gòu)造器必須調(diào)用同一個(gè)類中定義的其他構(gòu)造器(指定或便利都可以)
4.如果子類未定義任何指定構(gòu)造器豪硅,那么會(huì)默認(rèn)繼承所有來(lái)自父類的指定構(gòu)造器
5.指定構(gòu)造器必須要確保所有被類中提到的屬性在代理向上調(diào)用父類的指定構(gòu)造器前被初始化,之后才能將其他構(gòu)造任務(wù)交給父類的構(gòu)造器