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

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 ;
}

協議 NSObject

@protocol NSObject
@end

類 NSProxy

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

不錯的推薦:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章