類 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;
}
複製程式碼
- id和NSObject對比
- 從上面的原始碼可以看出,id是struct objc_object結構體指標,可以指向任何OC物件,當然不包括NSInteger等,因為這些資料型別不是OC物件。另外OC的基類,其實不僅僅就NSObject一個,雖然NSObject是絕大數OC物件的基類,但是還有個NSProxy虛類。
所以不能說id型別和
NSObject *
是等價的。 - id型別的例項在編譯階段不會做型別檢測,會在執行時確定,所以id型別是執行時的動態型別。類NSObject的例項會編譯期要做編譯檢查,保證指標指向是其NSObject類或其子類,當然例項的具體型別要在執行期確定,這也是iOS的多型的體現。
- id指標的會有侷限性:呼叫方法,只能使用中括弧,不能使用點語法。
- id <NSObject> 是什麼呢?
這裡的
NSObject
是協議NSObject(protocol)而非類NSObject。所以這裡表示是遵守協議NSObject的所以類。另外NSObject類和NSProxy類都是實現了協議NSObject。
不錯的推薦: