Objective-C(一) - 類與對象

今天講的是OC語言相關(guān)類的東西版述,基礎(chǔ)語法那些就不講了遥巴,講下他的特別的地方。
也是根據(jù)印象寫的嫩痰,難免有所紕漏,希望大家指正


Objective-C.png

關(guān)鍵字部分:


assign : 主要用于修飾基本數(shù)據(jù)類型窍箍,簡單賦值串纺,不更改引用計數(shù)。修飾的對象釋放后椰棘,指針的地址依舊存在纺棺,會造成野指針。在堆上容易造成崩潰邪狞。棧上的內(nèi)存系統(tǒng)會自動處理祷蝌。(關(guān)于堆棧會在內(nèi)存管理章節(jié)詳細(xì)說這一塊,可以簡單理解為因?yàn)榛緮?shù)據(jù)類型分配在棧中即可)

retain : MRC中使用帆卓。釋放舊值巨朦,保留新值,并增加新值的引用計數(shù)剑令。

strong :用于修飾強(qiáng)引用的屬性糊啡,釋放舊的對象,將舊的對象的值賦予新的對象吁津,并使引用計數(shù)+1

weak :相當(dāng)于assign棚蓄,用于修飾弱引用的屬性,與assign不同的地方是腺毫,weak會在對象消失的時候自動把指針置為nil.不會增加引用計數(shù)

copy :建立一個索引計數(shù)為1的對象癣疟,然后釋放舊的對象,一個對象發(fā)生變化不影響另一個對象潮酒。(copy只是淺復(fù)制睛挚,只復(fù)制指針地址,不會開辟新的內(nèi)存空間

@dynamic : 告訴編譯器不自動生成setter getter方法

@synthesize :如果屬性沒有手動實(shí)現(xiàn)setter和getter方法急黎,編譯器會自動加上這兩個方法

nonatomic :禁止多線程扎狱,變量保護(hù),提高性能勃教。它比atomic快淤击,但也是線程不安全的。

atomic : 修飾的對象會保證 setter 和 getter 的完整性故源,任何線程對其訪問都可以得到一個完整的初始化后的對象污抬。它比nonatomic安全,但不是絕對的線程安全,如多個線程調(diào)用set和get方法會導(dǎo)致獲得的對象值不同印机。絕對的線程安全可以用同步鎖@synchronizd.

類與對象


數(shù)據(jù)結(jié)構(gòu)

1.Class

 struct objc_class {
       struct objc_class *isa; // isa指針
       struct objc_class *super_class; // 父類指針
       const char *name; //類名
       long version; //版本信息矢腻,默認(rèn)為0
       long info; // 類信息,供運(yùn)行時使用的位標(biāo)識
       long instance_size; //該類的實(shí)例變量大小
       struct objc_ivar_list *ivars; // 該類的成員變量鏈表
#if defined(Release3CompatibilityBuild)
      struct objc_method_list *methods;        // 方法定義的鏈表
#else
      struct objc_method_list **methodLists; // 方法定義的鏈表
#endif
      struct objc_cache *cache;                      // 方法緩存
      struct objc_protocol_list *protocols;      // 協(xié)議鏈表
 }

重點(diǎn)介紹下幾個屬性

  1. isa指針: 在oc中所有類對象本身也是一個對象射赛,這個對象的Class里面也有一個isa指針指向metaClass多柑。
  2. super_class:指向該類的父類,如果是最頂層的根類(NSObject或NSProxy)楣责,則super_class為NULL.(tip:之后會講講NSProxy的應(yīng)用場景)竣灌。
  3. cache: 用于方法列表的緩存。

2.object

  struct objc-object {
     Class isa ;
  }
  typedef struct objc_object *id;

isa 指針指向object的類秆麸,當(dāng)某個對象調(diào)用消息時初嘹,會通過該對象的isa指針找到這個實(shí)例對象的類,在類的方法列表及父類的方法列表中查找沮趣。
當(dāng)創(chuàng)建一個實(shí)例對象時削樊,分配的內(nèi)存包含了一個objc_object數(shù)據(jù)結(jié)構(gòu),然后是類的實(shí)例變量的數(shù)據(jù)兔毒。NSObject類的alloc和allocWithZone:方法會調(diào)用class_creatInstance來創(chuàng)建objc_object數(shù)據(jù)結(jié)構(gòu)漫贞。

3.cache

  struct objc_cache {
    unsigned int mask;
    unsigned int occupied;
    Method buckets[1]; 
  }
  • mask: 當(dāng)前能達(dá)到的最大的index(從0開始),所以緩存的size(total)是mask+1
  • occupied:指定實(shí)際占用的緩存bucket的總數(shù)。因?yàn)閏ache是以散列表的形式存在的,所以會有空槽,occupied表示當(dāng)前被占用的數(shù)目罐栈。
  • buckets: 指向method數(shù)據(jù)結(jié)構(gòu)指針的數(shù)組。這個數(shù)組可能包含不超過mask+1個元素谴蔑。需要注意的是指針可能是NULL,表示該緩存bucket沒有被占用,另外占用的bucket可能是不連續(xù)的龟梦,這個數(shù)組會隨著時間增長隐锭。

常見區(qū)分

4. id 與 NSObjct*
id: typedef struct objc_object *id , id 本質(zhì)上是一個指向結(jié)構(gòu)體struct_object的指針。關(guān)于這個對象的消息计贰,編譯器需要到運(yùn)行時才會確定钦睡,所以編譯器不會判斷對這個對象調(diào)用的消息進(jìn)行判斷。
NSObjcet: 編譯器會確切知道了該類的所有消息躁倒,向該對象發(fā)送NSObject沒有聲明的消息的時候編譯器會報錯荞怒。

5.id與instancetype
instancetype:使方法的返回類型為所在類的類型。
id和instancetype的區(qū)別

  • id在編譯期無法判斷對象的真實(shí)類型
  • instancetype返回的對象調(diào)用方法時編譯器會進(jìn)行類型檢查秧秉,如果賦值給其他對象會報警告
  • id可以用來定義變量褐桌,也可以作為返回值,形參象迎,instancetype只能用于返回值

6.實(shí)例對象荧嵌,類對象以及他們的isa指針以及meta-class:

  • 實(shí)例對象objc_object的isa指針指向objc_class
  • 類對象 objc_class的isa指針指向自身的meta-class
  • meta-class的isa指針指向NSObject的meta-class,NSObject的meta-class指向自身

7. [self class] [super class]調(diào)用分析:
查看class的調(diào)用:

- (Class)class{
      return objcet_getClass(self);
}

super調(diào)用方法時實(shí)質(zhì)是調(diào)用:

objc_msgSendSuper(struct objc_super * _Nonull super, SEL _Nonnull op, ...)

可知super是一個指向 objc_super結(jié)構(gòu)體 的指針

查看objc_super

objc_super

objc_msgSendSuper函數(shù)可轉(zhuǎn)換為:

  objc_msgSendSuper((objc_super){(id)self,(id)class_getSuperClass(objc_getClass(self))},op)

顯然receiver就是實(shí)例對象,super_class為self的父類啦撮。所以調(diào)用super的時候傳遞的對象也就是receiver為self恋技。
所以 NSStringFromClass([self class]) 和NSStringFromClass([super class]) 返回的值是一樣的。

面試相關(guān)

  • 一個OC對象占用多少內(nèi)存
    系統(tǒng)分配了16個字節(jié)給NSObject對象(通過malloc_size函數(shù)獲得),但NSObject對象內(nèi)部只使用了8個字節(jié)的空間(64位環(huán)境下,通過class_getInstanceSize獲得)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末逻族,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子骄崩,更是在濱河造成了極大的恐慌聘鳞,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件要拂,死亡現(xiàn)場離奇詭異抠璃,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)脱惰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門搏嗡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人拉一,你說我怎么就攤上這事采盒。” “怎么了蔚润?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵磅氨,是天一觀的道長。 經(jīng)常有香客問我嫡纠,道長烦租,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任除盏,我火速辦了婚禮叉橱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘者蠕。我一直安慰自己窃祝,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布踱侣。 她就那樣靜靜地躺著锌杀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪泻仙。 梳的紋絲不亂的頭發(fā)上糕再,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天,我揣著相機(jī)與錄音玉转,去河邊找鬼突想。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的猾担。 我是一名探鬼主播袭灯,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼绑嘹!你這毒婦竟也來了稽荧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤工腋,失蹤者是張志新(化名)和其女友劉穎姨丈,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體擅腰,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蟋恬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了趁冈。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片歼争。...
    茶點(diǎn)故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖渗勘,靈堂內(nèi)的尸體忽然破棺而出沐绒,到底是詐尸還是另有隱情,我是刑警寧澤旺坠,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布洒沦,位于F島的核電站,受9級特大地震影響价淌,放射性物質(zhì)發(fā)生泄漏申眼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一蝉衣、第九天 我趴在偏房一處隱蔽的房頂上張望括尸。 院中可真熱鬧,春花似錦病毡、人聲如沸濒翻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽有送。三九已至,卻和暖如春僧家,著一層夾襖步出監(jiān)牢的瞬間雀摘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工八拱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留阵赠,地道東北人涯塔。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像清蚀,于是被迫代替她去往敵國和親匕荸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評論 2 355

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