instancetype
和id
在開發(fā)中我們經(jīng)常會用到instancetype
和id
,那么他們二者之間有什么區(qū)別呢?
我們首先創(chuàng)建一個工程,新建一個Animal
類和一個Dog
類,并且Dog
類繼承自Animal
類.
Animal.m
Dog
類繼承自Animal
類
在ViewController
中我們對Dog
進行實例化,并且隨便調用一個setFrame
方法,然后Command+B
進行編譯,居然沒有報錯;
然后我們將initObject
的返回值類型改為instancetype
,此時XCode馬上就給了我們一個錯誤的提示:
id
和 instancetype
的比較:
相同點:
instancetype
和 id
都是萬能指針芒珠,指向對象桥狡。
不同點:
1.id
在編譯的時候不能判斷對象的真實數(shù)據(jù)類型,而instancetype
在編譯的時候可以判斷對象的真實類型
2.id
可以用來定義變量,可以作為返回值類型裹芝,可以作為方法參數(shù)類型部逮;而instancetype
只能作為返回值類型
綜上所述,如果以后凡是自定義構造方法,返回值類型盡量使用`instancetype`嫂易,不要使用`id`
__kindof
表示當前類對象或者它的子類對象;
對于__kindof
我們來查看下經(jīng)常使用的一個方法:
- (nullable __kindof UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath;
該方法表明返回值類型是UITableViewCell
類型或者是它的子類對象類型;
為了更加明確的說明__kindof
的使用,我們還是拿上面的那個例子:我們將initObject
的返回值類型改為如下所示:
我們在調用方法時,通過返回值的提示, 可以看到具體的返回值類型, Animal
類型或者是它的子類對象:
而instancetype
和id
作為方法返回值的時候是看不到具體的返回值類型提示的.