id 和 instancetype

1.動(dòng)態(tài)數(shù)據(jù)類型

id是一個(gè)數(shù)據(jù)類型, 并且是一個(gè)動(dòng)態(tài)數(shù)據(jù)類型

  • 動(dòng)態(tài)數(shù)據(jù)類型的特點(diǎn):

    • 在編譯的時(shí)候編譯器并不知道變量的真實(shí)類型, 只有在運(yùn)行的時(shí)候才知道它的真實(shí)類型
      并且如果通過動(dòng)態(tài)數(shù)據(jù)類型定義變量, 如果訪問了不屬于動(dòng)態(tài)數(shù)據(jù)類型的屬性和方法, 編譯器不會(huì)報(bào)錯(cuò)
    • 通過靜態(tài)數(shù)據(jù)類型定義變量, 不能調(diào)用子類特有的方法
    • 通過動(dòng)態(tài)數(shù)據(jù)類型定義變量, 可以調(diào)用子類特有的方法
    • 通過動(dòng)態(tài)數(shù)據(jù)類型定義的變量, 可以調(diào)用私有方法
  • 弊端: 由于動(dòng)態(tài)數(shù)據(jù)類型可以調(diào)用任意方法, 所以有可能調(diào)用到不屬于自己的方法, 而編譯時(shí)又不會(huì)報(bào)錯(cuò), 所以可能導(dǎo)致運(yùn)行時(shí)的錯(cuò)誤

  • 應(yīng)用場景: 多態(tài), 可以減少代碼量, 避免調(diào)用子類特有的方法需要強(qiáng)制類型轉(zhuǎn)換

    id obj = [Person new];
    [obj sleep];
    [obj test];
    [obj eat];
    
    id obj2 = [Student new];
    [obj2 eat];
    [obj2 test];
  • 為了避免動(dòng)態(tài)數(shù)據(jù)類型引發(fā)的運(yùn)行時(shí)的錯(cuò)誤, 一般情況下如果使用動(dòng)態(tài)數(shù)據(jù)類型定義一個(gè)變量, 在調(diào)用這個(gè)對(duì)象的方法之前會(huì)進(jìn)行一次判斷, 判斷當(dāng)前對(duì)象是否能夠調(diào)用這個(gè)方法
    id obj = [Person new];
    id obj = [Student new];
   
    if ([obj isKindOfClass:[Student class]]) {
        // isKindOfClass , 判斷指定的對(duì)象是否是某一個(gè)類, 或者是某一個(gè)類的子類
        [obj eat];
    }
  
    if ([obj isMemberOfClass:[Student class]]) {
        // isMemberOfClass : 判斷指定的對(duì)象是否是當(dāng)前指定的類的實(shí)例
        [obj eat];
    }

2.id 和 instancetype的區(qū)別

  • id在編譯的時(shí)候不能判斷對(duì)象的真實(shí)類型
    instancetype在編譯的時(shí)候可以判斷對(duì)象的真實(shí)類型
  • id可以用來定義變量, 可以作為返回值, 可以作為形參
    instancetype只能用于作為返回值

注意: 以后但凡自定義構(gòu)造方法, 返回值盡量使用instancetype, 不要使用id

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容