在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;
}
- 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)用方法,只能使用中括弧瞳抓,不能使用點語法。
- id <NSObject> 是什么呢伏恐?
這里的NSObject
是協(xié)議NSObject(protocol)而非類NSObject孩哑。所以這里表示是遵守協(xié)議NSObject的所以類。另外NSObject類和NSProxy類都是實現(xiàn)了協(xié)議NSObject翠桦。
不錯的推薦: