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

雅之道法自然發表於2018-11-06

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。

不錯的推薦:

相關文章