我們?cè)诓檎褹PI的時(shí)候,經(jīng)常都會(huì)見到instancetype和id,他們區(qū)別并不大,都可以代表任何類型的對(duì)象.但是他倆還是有細(xì)微的差別的,接下來(lái)讓我們一步步去揭開他倆的面紗.
我們首先創(chuàng)建一個(gè)工程,新建一個(gè)Person類和一個(gè)Student類,并且Student類繼承自Person類.
另外在說instancetype與id的區(qū)別之前,首先需要補(bǔ)充一個(gè)知識(shí):當(dāng)父類的便利構(gòu)造器想要被子類繼承的話,在父類的便利構(gòu)造器中要使用[self alloc]來(lái)創(chuàng)建對(duì)象,這樣才能使子類調(diào)用父類的便利構(gòu)造器.
我們?cè)谥骱瘮?shù)main.m中用Person的便利構(gòu)造器來(lái)創(chuàng)建Student對(duì)象,同時(shí)調(diào)用test方法.
接下來(lái),我們把環(huán)境改成MRC.
同樣的在MRC環(huán)境中,依然可以運(yùn)行成功.通過簡(jiǎn)單的例子,我們可以看到instancetype和id的區(qū)別如下:
區(qū)別1:
在ARC(Auto Reference Count)環(huán)境下:
instancetype用來(lái)在編譯期確定實(shí)例的類型,而使用id的話,編譯器不檢查類型, 運(yùn)行時(shí)檢查類型.
在MRC(Manual Reference Count)環(huán)境下:
instancetype和id一樣,不做具體類型檢查
區(qū)別2:
id可以作為方法的參數(shù),但instancetype不可以
instancetype只適用于初始化方法和便利構(gòu)造器的返回值類型