我們寫一段代碼嘱丢,然后編譯成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ū)別就是玉组,屬性名生成下劃線谎柄,生成getter
和setter
方法。
實際上我們編寫的 OC 代碼惯雳,最終都是轉(zhuǎn)成了
runtime
庫的東西朝巫。比如:
- 類轉(zhuǎn)成了
Runtime
庫里面的結(jié)構(gòu)體等數(shù)據(jù)類型;- 方法轉(zhuǎn)成了
Runtime
庫里面的 C 語言函數(shù)石景;- 調(diào)用方法轉(zhuǎn)成了
objc_msgSend
函數(shù)(所以說 OC 有個消息發(fā)送機(jī)制)