iOS 2.NSObject---(類具有成員變量的) clang編譯OC成C++或者C文件

1.在iOS 引用「1.NSObject--- clang編譯OC成C++或者C文件」的類:BaseObj

    給此類.h文件添加非原子屬性:@property (nonatomic,copy) NSString *name;
       此時(shí) BaseObj_IMPL這個(gè)結(jié)構(gòu)體中會(huì)自動(dòng)添加_name的變量
      struct BaseObj_IMPL {
         struct NSObject_IMPL NSObject_IVARS;
         NSString * _Nonnull _name;//變量
        }
     在@implementation BaseObj也發(fā)生變化了
         生成底層相關(guān)的代碼:
         可以看出:1)掏觉、自動(dòng)生成成員變量 2)鼻由、setter  3 )巨缘、get
          static NSString * _Nonnull _I_BaseObj_name(BaseObj * self, SEL _cmd) { return (*(NSString * _Nonnull *)((char *)self + OBJC_IVAR_$_baseObj$_name)); }
          extern "C" __declspec(dllimport) void objc_setProperty (id, SEL, long, id, bool, bool);

          static void _I_BaseObj_setName_(BaseObj * self, SEL _cmd, NSString * _Nonnull name) { objc_setProperty (self, _cmd, __OFFSETOFIVAR__(struct BaseObj, _name), (id)name, 0, 1); }

2.生成一大堆結(jié)構(gòu)體

      {  _prop_t    
          _protocol_t   
          _objc_method    
          _ivar_t
          _class_ro_t
          _class_t
          _category_t
       }

3.類實(shí)例變量的生成

      extern "C" unsigned long int OBJC_IVAR_$_BaseObj$_name __attribute__ ((used, section ("__DATA,__objc_ivar"))) = __OFFSETOFIVAR__(struct BaseObj, _name);

      static struct /*_ivar_list_t*/ {
        unsigned int entsize;  // sizeof(struct _prop_t)
        unsigned int count;
        struct _ivar_t ivar_list[1];
     } _OBJC_$_INSTANCE_VARIABLES_BaseObj __attribute__ ((used, section ("__DATA,__objc_const"))) = {
       sizeof(_ivar_t),
       1,
      {{(unsigned long int *)&OBJC_IVAR_$_BaseObj$_name, "_name", "@\"NSString\"", 3, 8}}
    };

4.類實(shí)例方法的生成

   NSString :
        setter:(struct objc_selector *)"setName:", "v24@0:8@16", (void *)_I_BaseObj_setName_
        get :(struct objc_selector *)"name", "@16@0:8", (void *)_I_BaseObj_name

   NSInteger:
        setter:(struct objc_selector *)"setAge:", "v24@0:8q16", (void *)_I_BaseObj_setAge_
        get :{(struct objc_selector *)"age", "q16@0:8", (void *)_I_BaseObj_age

   static struct /*_method_list_t*/ {
          unsigned int entsize;  // sizeof(struct _objc_method)
         unsigned int method_count;
        struct _objc_method method_list[2];
    } _OBJC_$_INSTANCE_METHODS_BaseObj __attribute__ ((used, section ("__DATA,__objc_const"))) = {
         sizeof(_objc_method),
         2,   //NSString 所創(chuàng)建的 大致占有 2個(gè)字節(jié)   NSInteger:占有 2個(gè)字節(jié)
        {{(struct objc_selector *)"name", "@16@0:8", (void *)_I_BaseObj_name},
        {(struct objc_selector *)"setName:", "v24@0:8@16", (void *)_I_BaseObj_setName_}}
          /*如果添加屬性age 并有assgin修飾 
                {{(struct objc_selector *)"age", "q16@0:8", (void *)_I_BaseObj_age}
                {(struct objc_selector *)"setAge:", "v24@0:8q16", (void *)_I_BaseObj_setAge_}}
         */
    };

5.類屬性的生成_prop_list_t

 NSString生成屬性的格式:{"name","T@\"NSString\",C,N,V_name"}
 NSInteger生成屬性的格式:{"age","Tq,N,V_age"}

 static struct /*_prop_list_t*/ {
     unsigned int entsize;  // sizeof(struct _prop_t)
     unsigned int count_of_properties;
     struct _prop_t prop_list[1];
  } _OBJC_$_PROP_LIST_BaseObj __attribute__ ((used, section ("__DATA,__objc_const"))) = {
          sizeof(_prop_t),
          1,
          {{"name","T@\"NSString\",C,N,V_name"},{"age","Tq,N,V_age"}}
  };

5.生成_class_ro_t
class_ro_t 和 class_rw_t 的區(qū)別?
ObjC 類中的屬性吨拗、方法還有遵循的協(xié)議等信息都保存在 class_rw_t 中:
其中還有一個(gè)指向常量的指針 ro,其中存儲(chǔ)了當(dāng)前類在編譯期就已經(jīng)確定的屬性、方法以及遵循的協(xié)議白筹。

 1)、_OBJC_METACLASS_RO_ 沒有發(fā)生變化
 static struct _class_ro_t _OBJC_METACLASS_RO_$_BaseObj __attribute__ ((used, section ("__DATA,__objc_const"))) = {
     1, sizeof(struct _class_t), sizeof(struct _class_t), 
     (unsigned int)0, 
     0, 
     "BaseObj",
     0, 
     0, 
     0, 
     0, 
     0, 
  };

2)谅摄、_OBJC_CLASS_RO_ 發(fā)生變化
     (1)徒河、添加實(shí)例方法 (2)、添加成員變量 (3)送漠、添加屬性列表
static struct _class_ro_t _OBJC_CLASS_RO_$_BaseObj __attribute__ ((used, section ("__DATA,__objc_const"))) = {
      0, __OFFSETOFIVAR__(struct BaseObj, _name), sizeof(struct BaseObj_IMPL), 
      (unsigned int)0, 
      0, 
      "BaseObj",
      (const struct _method_list_t *)&_OBJC_$_INSTANCE_METHODS_BaseObj,
      0, 
      (const struct _ivar_list_t *)&_OBJC_$_INSTANCE_VARIABLES_BaseObj,
      0, 
      (const struct _prop_list_t *)&_OBJC_$_PROP_LIST_BaseObj,
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末顽照,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子闽寡,更是在濱河造成了極大的恐慌代兵,老刑警劉巖尼酿,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異奢人,居然都是意外死亡谓媒,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門何乎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來句惯,“玉大人,你說我怎么就攤上這事支救∏酪埃” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵各墨,是天一觀的道長指孤。 經(jīng)常有香客問我,道長贬堵,這世上最難降的妖魔是什么恃轩? 我笑而不...
    開封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮黎做,結(jié)果婚禮上叉跛,老公的妹妹穿的比我還像新娘。我一直安慰自己蒸殿,他們只是感情好筷厘,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著宏所,像睡著了一般酥艳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上爬骤,一...
    開封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天充石,我揣著相機(jī)與錄音,去河邊找鬼盖腕。 笑死赫冬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的溃列。 我是一名探鬼主播劲厌,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼听隐!你這毒婦竟也來了补鼻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎风范,沒想到半個(gè)月后咨跌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡硼婿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年锌半,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寇漫。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡刊殉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出州胳,到底是詐尸還是另有隱情记焊,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布栓撞,位于F島的核電站遍膜,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏瓤湘。R本人自食惡果不足惜瓢颅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望弛说。 院中可真熱鬧惜索,春花似錦、人聲如沸剃浇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽虎囚。三九已至,卻和暖如春蔫磨,著一層夾襖步出監(jiān)牢的瞬間淘讥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來泰國打工堤如, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蒲列,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓搀罢,卻偏偏與公主長得像蝗岖,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子榔至,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359