iOS中id與NSObject * 和id<NSObject>的區別

1.

這是id的定義,它就是一個指針,它可以指向的類型不僅局限于NSObject,

typedef struct objc_class *Class;

typedef struct objc_object {

Class isa;

} *id;

2.NSObject *就是NSObject類型的指針,它的范圍小。

3.id<NSObject>是指針,它要求它指向的類型要實現NSObject protocol。但他和NSObject不是一個東西。

而NSObject類實現了NSObject接口,所以id<NSObject>的對象。

NSObject實現類似這樣:

@interface <NSObject>{

Class isa;

}


如果我們來看看NSProxy的定義,你會發現,它不是繼承自NSObject,但是卻實現了NSObjecct接口,

NSProxy定義類似這樣:

@interface NSProxy<NSObject>{

Class isa;

}

所以id可以指向NSProxy的對象。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 轉至元數據結尾創建: 董瀟偉,最新修改于: 十二月 23, 2016 轉至元數據起始第一章:isa和Class一....
    40c0490e5268閱讀 1,775評論 0 9
  • 原文出處:南峰子的技術博客 Objective-C語言是一門動態語言,它將很多靜態語言在編譯和鏈接時期做的事放到了...
    _燴面_閱讀 1,258評論 1 5
  • runtime 和 runloop 作為一個程序員進階是必須的,也是非常重要的, 在面試過程中是經常會被問到的, ...
    made_China閱讀 1,230評論 0 7
  • Objective-C語言是一門動態語言,它將很多靜態語言在編譯和鏈接時期做的事放到了運行時來處理。這種動態語言的...
    有一種再見叫青春閱讀 611評論 0 3
  • Objective-C語言是一門動態語言,他將很多靜態語言在編譯和鏈接時期做的事情放到了運行時來處理。這種動態語言...
    tigger丨閱讀 1,432評論 0 8