零纺蛆,構(gòu)造函數(shù)
1吐葵,一種特殊的函數(shù)
2,主要用來在創(chuàng)建對(duì)象是桥氏,初始化對(duì)象
3温峭,給對(duì)象的成員變量設(shè)置初始值
4,Swift支持函數(shù)重載识颊,所有構(gòu)造函數(shù)都是init
5诚镰,作用是分配空間奕坟,設(shè)置初始值
注意:
1,oc的初始化是從類繼承關(guān)系鏈清笨,從父類開始逐級(jí)向子類初始化
2月杉,swift的初始化,是先從子類開始抠艾,逐級(jí)向父類初始化
3苛萎,非optional屬性,都必須要在構(gòu)造器中設(shè)置初始值检号,從而保證對(duì)象在被實(shí)例化的時(shí)候腌歉,屬性都被正確的初始化
4,在調(diào)用父類構(gòu)造函數(shù)之前齐苛,必須保證本類的屬性已經(jīng)完成初始化
5翘盖,swift中的構(gòu)造函數(shù)不用寫func關(guān)鍵字
6,默認(rèn)的構(gòu)造函數(shù)不能給本類的屬性分配空間
7凹蜂,如果重載了構(gòu)造函數(shù)馍驯,并且沒有實(shí)現(xiàn)父類的init方法,系統(tǒng)不再提供init函數(shù)(默認(rèn)會(huì)提供的)
一玛痊,構(gòu)造器分兩類:
1汰瘫,指定構(gòu)造器;
2擂煞,便利構(gòu)造器混弥;
二,每一個(gè)類至少有一個(gè)指定構(gòu)造器(子類默認(rèn)有一個(gè))
1对省,指定構(gòu)造器是類的主要構(gòu)造器蝗拿,初始化的所有屬性,要在指定構(gòu)造器賦值官辽,并且要在當(dāng)前構(gòu)造器中蛹磺,調(diào)用父類合適的指定構(gòu)造器
三粟瞬,便利構(gòu)造器是類的次要構(gòu)造器同仆,你需要讓便利構(gòu)造器去調(diào)用同一個(gè)類中的指定構(gòu)造器,并將這個(gè)指定構(gòu)造器中的參數(shù)填上你想要的默認(rèn)參數(shù)
Init 方法必須遵循幾條規(guī)則:
1裙品,指定構(gòu)造器必須調(diào)用他直接父類的指定構(gòu)造器俗批;
2,便利構(gòu)造器必須調(diào)用同一個(gè)類中的其它初始化方法市怎;(初始化方法可以是便利構(gòu)造器岁忘,也可以是指定構(gòu)造器,歸結(jié)是必須要調(diào)用到指定構(gòu)造器)区匠;
3干像,便利構(gòu)造器在最后必須調(diào)用本類的指定構(gòu)造器帅腌;(如果本類沒有指定構(gòu)造器,那么就要調(diào)用本類的默認(rèn)指定構(gòu)造器)
4麻汰,只有指定構(gòu)造器才可以調(diào)用父類指定構(gòu)造器速客,而便利構(gòu)造器是不可以的
init 機(jī)制:
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òu)造完成之前规婆,不能調(diào)用任何實(shí)例方法癞埠,不能讀取任何實(shí)例屬性的值,self不能被引用聋呢。
階段一:簡(jiǎn)單說是苗踪,子類屬性都已經(jīng)賦值,完成內(nèi)存的初始化削锰,然后向上(父類—>子類鏈)通铲,重復(fù)子類的操作,直到構(gòu)造器鏈的最頂部器贩,所有的屬性以及內(nèi)存被完全初始化颅夺,才進(jìn)入階段二
階段二:從頂部構(gòu)造器鏈向下,每個(gè)構(gòu)造器鏈中類的指定構(gòu)造器都有機(jī)會(huì)進(jìn)一步定制實(shí)例蛹稍。構(gòu)造器此時(shí)可以訪問self吧黄,它的屬性并調(diào)用實(shí)例方法等。唆姐。
簡(jiǎn)單的說是拗慨,代碼里面,便利構(gòu)造器調(diào)用父類指定構(gòu)造器之前奉芦,不能使用self赵抢,屬性及方法的調(diào)用,如果是本類的指定構(gòu)造器声功,self和屬性可以在調(diào)用父類指定構(gòu)造器之前調(diào)用烦却,但是實(shí)例方法,必須要在調(diào)用父類指定構(gòu)造器之后才可以調(diào)用
Init 的繼承與重載
Swift中子類不會(huì)繼承來自父類的所有構(gòu)造器先巴,這樣可以防止錯(cuò)誤的繼承并使用父類的構(gòu)造器生成錯(cuò)誤的實(shí)例
關(guān)于init的繼承:
1其爵,如果子類沒有定義指定構(gòu)造器冒冬,默認(rèn)會(huì)繼承父類所有的指定構(gòu)造器
2,如果子類提供了所有父類指定構(gòu)造器的實(shí)現(xiàn)摩渺,它將自動(dòng)繼承所有父類的便利構(gòu)造器
參考:
1窄驹,重點(diǎn)在論述,比較全面:https://my.oschina.net/hejunbinlan/blog/470123
2证逻,有代碼演示:https://www.cnblogs.com/Alex-sk/p/5528760.html