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

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

類 idobjective-c

/// 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;
複製代碼

類 NSObjectapp

@interface NSObject <NSObject> {
    Class isa ;
}
複製代碼

協議 NSObjectspa

@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。

不錯的推薦:code

相關文章
相關標籤/搜索