1 objective-c ->c\c++->匯編語(yǔ)言(不同的平臺(tái)指令不同朝刊,顯示的代碼不同)->機(jī)器語(yǔ)言禀酱。
2 .m文件轉(zhuǎn)換成c++
命令行:xcrun -sdk iphoneos(平臺(tái)) clang -arch(架構(gòu)) arm64 -rewrite-objc ?OC源文件 - 0 輸出的CPP文件惨好。
3 模擬器 i386 32bit(armv7) 64bit (arm64)
struct NSObject_IMPL {
?Class isa; // 8個(gè)字節(jié)
}
// 指針
typedef struct objc_class* Class;
OC的指針轉(zhuǎn)換成C的指針 (__bridge const void *)
// 獲取NSObject 實(shí)例對(duì)象的成員變量所占用的內(nèi)存大小 >> 8個(gè)字節(jié)耕皮。
class_getInstanceSize([NSObject class]) // 內(nèi)存對(duì)齊過(guò)的成員變量的大小
// 源碼
// class's ivar size rounded up to pointer-size boundary
uint32_t align
1 系統(tǒng)分配了16個(gè)字節(jié)給NSObject對(duì)象(通過(guò)malloc_size函數(shù))
獲得obj指針?biāo)赶騼?nèi)存的大小 >> 16
malloc_size((__bridge const void*)obj));
但是NSObject對(duì)象內(nèi)部只使用了8個(gè)字節(jié)的空間(64bit).
?2 內(nèi)存對(duì)齊:結(jié)果體的最終大小必須是最大成員大小的倍數(shù)
?3 alloc 出來(lái)的實(shí)列對(duì)象不存儲(chǔ)方法所禀。
4 ?
struct NSObject_IMP{
Class isa
}
struct Person_IMPL
{
struct NSObject_IMP NSOBJECTPERSON
int ?_age;
}
@interface Person:NSobject
{
int age;
}
5 ?創(chuàng)建一個(gè)實(shí)列對(duì)象由捎,至少需要多些內(nèi)存
#import <objc/runtime.h>
class_getInstanceSize([NSObject class]);
6 創(chuàng)建一個(gè)實(shí)列對(duì)象适掰,實(shí)際分配了多小內(nèi)存
#import <malloc/malloc.h>
malloc_size((__bridge const void*)obj);
sizeof() 類型的大小 運(yùn)算符 編譯時(shí)確定
OC對(duì)象的分類
instance 對(duì)象(實(shí)列對(duì)象)
isa指針
其他的成員變量
class對(duì)象(類對(duì)象)
他們都是同一個(gè)對(duì)象叉袍,每一個(gè)類在內(nèi)存中有??只有一個(gè)class對(duì)象
isa 指針
superclass 指針
類的屬性信息(@property),
類的對(duì)象方法信息(instance method)
類的協(xié)議信息(protocal),類的成員變量信息(ivar)
meta-class 對(duì)象(元類對(duì)象)(meta-data)(元數(shù)據(jù))
Class objectMetaClass = get_getClass([NSObject class]); //runtime api
1 objectMetaClass 是NSObject的meta-class對(duì)象(元類對(duì)象)
2 每個(gè)類在內(nèi)存中有且只有一個(gè)meta-class對(duì)象
3 meta-class對(duì)象和class對(duì)象的內(nèi)存結(jié)構(gòu)是一樣的次绘,但是用途不一樣瘪阁,在內(nèi)存存儲(chǔ)的信息不同:
isa 指針
superclass 指針
類的類方法信息(class method)
...
Class object_getClass(id obj) {
// 如果obj是一個(gè)instance 對(duì)象,返回class對(duì)象
// 如果是class對(duì)象邮偎,返回meta-class對(duì)象
// 如果是meta-class對(duì)象 返回nsobject的meta-class對(duì)象
if(obj) return obj->getIsa();
else return nil;
}
// 直接返回類對(duì)象
?Class objc_getClass(const *char name) {
//
// 類方法
objc_msgSend([MJPerson class],@selector());
// 實(shí)列方法
objc_msgSend(person,@selector());
1 從64bit開(kāi)始管跺,實(shí)列對(duì)象的isa需要進(jìn)行一次位運(yùn)算才能算出class的地址。
2?
struct objc_class:objc_object {
class supperClass;
cache_t cache;
class_data_bites bits;
}
對(duì)象的isa的指針指向哪里
1 instance對(duì)象的isa指向class對(duì)象
2 class對(duì)象的isa指向meta-class對(duì)象
3 meta-class對(duì)象的isa指向積累的meta-class對(duì)象
OC的類信息存放在哪里
對(duì)象方法禾进,屬性豁跑,成員變量,協(xié)議信息存放在class對(duì)象中
類方法存放在meta-class對(duì)象中
成員變量的具體值泻云,存放在instance對(duì)象艇拍。
類對(duì)象和元類對(duì)象在程序開(kāi)啟的時(shí)候就加載進(jìn)入內(nèi)存,只保存一份宠纯。當(dāng)程序退出的時(shí)候銷毀內(nèi)存卸夕。