前言
我們平時編些的Objective-C,底層實現(xiàn)都是C/C++以及部分匯編代碼編寫的瘦锹,Ojective-C高級語言通過編譯器,生成CPU可以直接執(zhí)行的機器語言。
Clang是一個由Apple主導編寫碾褂,基于LLVM的C/C++/Objective-C編譯器泣港,它可以將Ojective-C編寫的.m文件編譯為C++編寫的.cpp文件暂殖。
1.對象的本質(zhì)
首先我們在terminal執(zhí)行clang -rewrite-objc main.m -o main.cpp
命令將下面代碼的.m文件編譯為.cpp文件
#import <Foundation/Foundation.h>
@interface ZFPerson:NSObject
@property (nonatomic,strong) NSString *nickName;
@end
@implementation ZFPerson
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
ZFPerson *person = [[ZFPerson alloc] init];
}
return 0;
}
注意:如果出現(xiàn)UIKit問題,可以嘗試執(zhí)行
clang -rewrite-objc -fobjc-arc -fobjc-runtime=ios-13.0.0 -isysroot
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.0.sdk main.m
言歸正傳当纱,從編譯后的.cpp文件中呛每,我們可以發(fā)現(xiàn)ZFPerson對象變成了ZFPerson_IMPL,所以OC對象的本質(zhì)是C++結構體
2.結構體內(nèi)存對齊原則
1:數(shù)據(jù)成員對?規(guī)則:結構(struct)(或聯(lián)合(union))的數(shù)據(jù)成員坡氯,第
一個數(shù)據(jù)成員放在offset為0的地方晨横,以后每個數(shù)據(jù)成員存儲的起始位置要
從該成員大小或者成員的子成員大小(只要該成員有子成員,比如說是數(shù)組箫柳,
結構體等)的整數(shù)倍開始(比如int為4字節(jié),則要從4的整數(shù)倍地址開始存
儲手形。 min(當前開始的位置mn)m = 9 n = 4 9 10 11 12
2:結構體作為成員:如果一個結構里有某些結構體成員,則結構體成員要從
其內(nèi)部最大元素大小的整數(shù)倍地址開始存儲.(struct a里存有struct b,b
里有char,int ,double等元素,那b應該從8的整數(shù)倍開始存儲.)
3:收尾工作:結構體的總大小,也就是sizeof的結果,必須是其內(nèi)部最大成員的整數(shù)倍.不足的要補?。