Objective-C學(xué)習(xí)總結(jié)(OC語法1)

Objective-C的本質(zhì)

  • Objective-C代碼蓝丙,底層實習(xí)都是C\C++代碼;


    Objective-C編譯
  • 所以O(shè)bjective-C的面相對象都是基與C\C++的數(shù)據(jù)結(jié)構(gòu)實現(xiàn)的。
  • 如何將Objective-C轉(zhuǎn)成C\C++代碼晤硕。
    xcrun -sdk iphones clang -arch arm64 -rewrite-objc OC源碼文件 輸出的CPP文件
    如果需要鏈接其他框架渠退,使用-framework 參數(shù)块仆。eg -framework UIKit

OC對象的本質(zhì)

NSObject的底層實現(xiàn)
OC對象的本質(zhì)就是一個結(jié)構(gòu)體。

struck NSObject_IPML{
    Class isa;
  }
@interface NSObject{
    Class isa;
  }
 typedef struct objc_class *Class;
OC對象的本質(zhì)
OC 對象內(nèi)存空間
  • 創(chuàng)建一個實例對象翩迈。多少內(nèi)存

    #import <objc/runtime.h>
    class_getInstanceSize([NSObject class]);
    

我們可以看到打印出來是8個字節(jié)持灰,因為在內(nèi)存中,這個對象可以看做是一個結(jié)構(gòu)題负饲,這個結(jié)構(gòu)體中只有Class isa 堤魁,Class 就是 typedefe struct object_class * Class這個就是一個指針,一個指針在64位系統(tǒng)中占8個字節(jié)返十。

  • 創(chuàng)建一個實例對象妥泉,實際上分配了多少內(nèi)存

    #import<malloc/malloc.h>
    malloc_size((__bridge const void*)obj);
    

這里得到的值是16個字節(jié),為什么是16個字節(jié)呢洞坑,看源碼如圖

源碼

在源碼中通過上面的分析aligneInstanceSize()的長度為8.extraBytes 的長度為0. 然后系統(tǒng)當(dāng)size 小于8的時候會改成16.(其實這里也設(shè)計到內(nèi)存對齊的問題)盲链。

OC對象的分類
  • instance 對象(實例對象)
  • class 對象 (類對象)
  • meta-class對象(云對象)
instace對象
  • instance 對象就是通過類alloc出來的對象,每次alloc都會產(chǎn)生新的instance對象迟杂。

    NSObject * object1 =[[NSObject alloc]init];
    NSObject * object2 =[[NSObject alloc]init];
    

object1,object2是NSObject的instance對象(實例對象);
他們是不同的兩個對象刽沾,分別占據(jù)不同的內(nèi)存。
instance 對象在內(nèi)旋中存儲的信息包括排拷。
isa 指針
其他成員變量


實例對象的結(jié)構(gòu)
Class 對象
    NSObject * object1 =[NSObject alloc]init];
    NSObject * object2 =[NSObject alloc]init];
    Class objectClass1 = [object1 class];
    Class objectClass2 = [object2 class];
    Class objectClass3 = [NSObject class];
    Class objectClass4 = object_getClass(object1);
     Class objectClass5 = object_getClass(object2);

object1 到object5 都是NSObjectClass 的class 對象侧漓。(類對象)
他們是同一個對象,每個類在內(nèi)存中只有一個class 對象监氢。
calss 對象在內(nèi)存中的信息主要包括
isa 指針
superclass 指針
類的屬性信息(@property)類的對象方法信息(instance method)布蔗;
類的協(xié)議信息(protocol)類的成員變量嘻嘻(ivar)


class對象在內(nèi)存中的存儲信息
meta-class
  Class objectMeataClass = object_getClass([NSObject class]);

objectMeataClass 是NSObject的meta-class對象藤违。
每個類在內(nèi)存中有且只有一個meta-class 對象。
meta-class 對象和class對象結(jié)構(gòu)是一樣的纵揍,但是用途不一樣顿乒,在內(nèi)存中存儲的信息主要包括
isa指針
superclass 指針
類的類方法信息(class method )

原類對象在內(nèi)存中的結(jié)構(gòu)

怎么檢查Class 是否為meta-class

#import <objc/runtime.h>
 BOOL result = class_isMetaClass([NSObject class]);
isa 指針
isa 指針

instance 的isa 指向class
當(dāng)調(diào)用對象方法時,通過instance的isa 找到class 泽谨,最后找到對象方法的實現(xiàn)調(diào)用璧榄。
class 的isa指向meta-class
當(dāng)調(diào)用類方法時,通過class 的的isa指針找到meta-class 隔盛,最后找到類方法的實現(xiàn)調(diào)用犹菱。

class 對象的superclass指針
繼承關(guān)系的指針

當(dāng)Student 的instace對象要調(diào)用Person的對象方法時,回先通過isa找到Student的class吮炕,然后通過superclass找到person的class ,最后執(zhí)行找到對象方法的實現(xiàn)進行調(diào)用访得。

meta-class 對象的superclass
19054661-A99B-457D-AF23-5EFC27CD855C.png

當(dāng)Sutdent的class要調(diào)用Persion類方法時龙亲,回先通過isa找到Student的meta-class,然后通過superclass周到Person的meta-class悍抑,最后到類方法中的實現(xiàn)進行調(diào)用

isa superclass 總結(jié)
isa superclass總結(jié)
  • instace isa 指向class
  • class isa 指向 meta-class
  • meta-class指向基類的meta-class

*class的superclass 指向父類的class 如果沒有父類鳄炉,superclass指針為nil

  • meta-class 的superclass 指向父類的meta-class,基類的meta-class的superclass指向基類的class
    *instance 調(diào)用對象方法的軌跡
    isa 找class搜骡,方法不存在通過fuperclass 找到父類
  • class 調(diào)用類方法的軌跡
    isa 找到meta-class 拂盯,方法不存在,就通過superclass 找到父類记靡。
窺探struct objc_class的結(jié)構(gòu)
struct objc_class
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谈竿,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子摸吠,更是在濱河造成了極大的恐慌空凸,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寸痢,死亡現(xiàn)場離奇詭異呀洲,居然都是意外死亡,警方通過查閱死者的電腦和手機啼止,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門道逗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人献烦,你說我怎么就攤上這事滓窍。” “怎么了仿荆?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵贰您,是天一觀的道長坏平。 經(jīng)常有香客問我,道長锦亦,這世上最難降的妖魔是什么舶替? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮杠园,結(jié)果婚禮上顾瞪,老公的妹妹穿的比我還像新娘。我一直安慰自己抛蚁,他們只是感情好陈醒,可當(dāng)我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著瞧甩,像睡著了一般钉跷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上肚逸,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天爷辙,我揣著相機與錄音,去河邊找鬼朦促。 笑死膝晾,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的务冕。 我是一名探鬼主播血当,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼禀忆!你這毒婦竟也來了臊旭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤油湖,失蹤者是張志新(化名)和其女友劉穎巍扛,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乏德,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡撤奸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了喊括。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胧瓜。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖郑什,靈堂內(nèi)的尸體忽然破棺而出府喳,到底是詐尸還是另有隱情,我是刑警寧澤蘑拯,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布钝满,位于F島的核電站兜粘,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏弯蚜。R本人自食惡果不足惜孔轴,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望碎捺。 院中可真熱鬧路鹰,春花似錦、人聲如沸收厨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽诵叁。三九已至雁竞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間黎休,已是汗流浹背浓领。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留势腮,地道東北人。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓漫仆,卻偏偏與公主長得像捎拯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子盲厌,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容