本文目標(biāo):
1、理清objc_class和objc_object關(guān)系,知道里面存放ias指針
2、可以下載蘋果源碼
https://gitee.com/renrencai110/objc4-8669-source-code.git
NSObject、Class、objc_object、objc_class、id。
typedef這個(gè)是重新定義,簡(jiǎn)化稱號(hào)
在源碼Source文件夾下的NSObject查到
+ (Class)class {
return self;
}
#if !OBJC_TYPES_DEFINED
/// 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 OBJC_ISA_AVAILABILITY;
};
/// A pointer to an instance of a class.
typedef struct objc_object *id;
#endif
//和NSObject是一個(gè),在不同語(yǔ)言環(huán)境叫法不一樣在C語(yǔ)言中叫objc_object
objc_class是一個(gè)代表對(duì)象類的結(jié)構(gòu)體,所以NSObject類中包含的是一個(gè)objc_class結(jié)構(gòu)體類型的isa,指向該對(duì)象對(duì)應(yīng)的類
struct objc_class : objc_object {
objc_class(const objc_class&) = delete;
objc_class(objc_class&&) = delete;
void operator=(const objc_class&) = delete;
void operator=(objc_class&&) = delete;
// Class ISA;
Class superclass;
cache_t cache; // formerly cache pointer and vtable
class_data_bits_t bits; // class_rw_t * plus custom rr/alloc flags
}
objc_object是一個(gè)代表對(duì)象實(shí)例的結(jié)構(gòu)體,objc_object中只包含一個(gè)isa_t結(jié)構(gòu)體類型的isa,所以objc_class中也會(huì)包含一個(gè)isa_t結(jié)構(gòu)體類型的isa。**這個(gè)isa_t結(jié)構(gòu)體包含了當(dāng)前對(duì)象指向的類的信息。
struct objc_object {
private:
char isa_storage[sizeof(isa_t)];
isa_t &isa() { return *reinterpret_cast<isa_t *>(isa_storage); }
const isa_t &isa() const { return *reinterpret_cast<const isa_t *>(isa_storage); }
public:
// ISA() assumes this is NOT a tagged pointer object
Class ISA(bool authenticated = false);
// rawISA() assumes this is NOT a tagged pointer object or a non pointer ISA
Class rawISA();
// getIsa() allows this to be a tagged pointer object
Class getIsa();
uintptr_t isaBits() const;
從objc_class和objc_object的關(guān)系,和數(shù)據(jù)類型看,可以得出類的本質(zhì)是一個(gè)結(jié)構(gòu)體,里面有Class、cache_t、class_data_bits_t
其中cache_t、class_data_bits_t里面還是結(jié)構(gòu)體