系統(tǒng)底層源碼分析(15)——對象的本質(zhì)

我們寫一段代碼,然后編譯成cpp文件:

@interface Person : NSObject 
{
    NSString *nikename; 
}
@property (nonatomic, copy) NSString *name; 
@end

@implementation Person
@end

.m文件由 OC 轉(zhuǎn) C++ 源碼方法如下:
打開終端,執(zhí)行 cd 文件所在目錄 命令,
然后執(zhí)行 clang -rewrite-objc xxx.m ,
之后xxx.m 所在目錄下就會生成一個 xxx.cpp 文件,這就是相關(guān)的 C++ 源碼。

//編譯后
extern "C" unsigned long OBJC_IVAR_$_Person$_name;
struct Person_IMPL {
    struct NSObject_IMPL NSObject_IVARS;
    NSString *nikename;
    NSString *_name;//生成下劃線
};

//getter
static NSString * _I_Person_name(Person * self, SEL _cmd) { return (*(NSString **)((char *)self + OBJC_IVAR_$_Person$_name)); }
extern "C" __declspec(dllimport) void objc_setProperty (id, SEL, long, id, bool, bool);
//setter
static void _I_Person_setName_(Person * self, SEL _cmd, NSString *name) { objc_setProperty (self, _cmd, __OFFSETOFIVAR__(struct Person, _name), (id)name, 0, 1); }

對象的本質(zhì)就是結(jié)構(gòu)體。
@@property寫的屬性和大括號里寫的成員變量區(qū)別就是,屬性名生成下劃線,生成gettersetter方法。

實際上我們編寫的 OC 代碼,最終都是轉(zhuǎn)成了runtime庫的東西。比如:

  1. 類轉(zhuǎn)成了Runtime庫里面的結(jié)構(gòu)體等數(shù)據(jù)類型;
  2. 方法轉(zhuǎn)成了Runtime庫里面的 C 語言函數(shù);
  3. 調(diào)用方法轉(zhuǎn)成了 objc_msgSend 函數(shù)(所以說 OC 有個消息發(fā)送機制)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容