知識點:id 和NSObject *對比,以及id <NSObject>介紹

image

在obj.h的類文件中,可以看出id類型和NSObject類型的信息。如下:

類 id

/// An opaque type(隱含類型) that represents an Objective-C class.
typedef struct objc_class *Class;
/// Represents an instance of a class.
struct objc_object {
    Class _Nonnull isa ;
};
/// A pointer to an instance of a class.
typedef struct objc_object *id;

類 NSObject

@interface NSObject <NSObject> {
    Class isa ;
}

協(xié)議 NSObject

@protocol NSObject
@end

類 NSProxy

@interface NSProxy <NSObject> {
    Class   isa;
}
  1. id和NSObject對比
  • 從上面的源碼可以看出,id是struct objc_object結(jié)構(gòu)體指針,可以指向任何OC對象,當(dāng)然不包括NSInteger等,因為這些數(shù)據(jù)類型不是OC對象。另外OC的基類,其實不僅僅就NSObject一個,雖然NSObject是絕大數(shù)OC對象的基類,但是還有個NSProxy虛類。
    所以不能說id類型和NSObject *是等價的。
  • id類型的實例在編譯階段不會做類型檢測,會在運行時確定,所以id類型是運行時的動態(tài)類型。類NSObject的實例會編譯期要做編譯檢查,保證指針指向是其NSObject類或其子類,當(dāng)然實例的具體類型要在運行期確定,這也是iOS的多態(tài)的體現(xiàn)。
  • id指針的會有局限性:調(diào)用方法,只能使用中括弧,不能使用點語法。
  1. id <NSObject> 是什么呢?
    這里的NSObject是協(xié)議NSObject(protocol)而非類NSObject。所以這里表示是遵守協(xié)議NSObject的所以類。另外NSObject類和NSProxy類都是實現(xiàn)了協(xié)議NSObject。

不錯的推薦:

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

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

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時...
    歐辰_OSR閱讀 30,223評論 8 265
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,635評論 1 32
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 2,041評論 0 9
  • Runtime是什么 Runtime 又叫運行時,是一套底層的 C 語言 API,其為 iOS 內(nèi)部的核心之一,我...
    SuAdrenine閱讀 976評論 0 3
  • vince是我的初中同學(xué),也是我愛了好幾年的人。好幾年,我也忘了是幾年,總之這幾年vince這個名字就像鉛塊一樣重...
    阿媺閱讀 585評論 0 0

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