OC基礎(chǔ)-類的加載(三)

內(nèi)存中的五大區(qū)域.

一、棧區(qū)

又稱 堆棧 瘾境,由編譯器自動(dòng)分配釋放越除,是用戶存放程序臨時(shí)創(chuàng)建的 局部變量 ,也就是說我們函數(shù)括弧“{}” 中定義的變量(但不包括 static 聲明的變量, static 意味著在數(shù)據(jù)段中存放變量)棒坏。除此以外, 在函數(shù)被調(diào)用時(shí),其參數(shù)也會(huì)被壓入發(fā)起調(diào)用的進(jìn)程棧中,并且待到調(diào)用結(jié)束后,函數(shù)的返回值 也會(huì)被存放回棧中臭挽。
由于 棧 的后進(jìn)先出特點(diǎn),所以 棧 特別方便用來(lái)保存/恢復(fù)調(diào)用現(xiàn)場(chǎng)。從這個(gè)意義上講,我們可以把 堆棧 看成一個(gè)寄存絮爷、交換臨時(shí)數(shù)據(jù)的內(nèi)存區(qū)趴酣。
棧的地址空間在iOS中是以0X7開頭

  • 棧 是向低地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是一塊連續(xù)的內(nèi)存區(qū)域

二坑夯、堆區(qū)

用于存放進(jìn)程運(yùn)行中被 動(dòng)態(tài)分配 的內(nèi)存段岖寞,堆區(qū)的大小并不固定,可動(dòng)態(tài)擴(kuò)張或縮減渊涝。當(dāng)進(jìn)程調(diào)用 alloc 等函數(shù)分配內(nèi)存時(shí),新分配的內(nèi)存就被動(dòng)態(tài)添加到堆上(堆被擴(kuò)張)床嫌;當(dāng)利用 realse 釋放內(nèi)存時(shí)跨释,被釋放的內(nèi)存從堆中被剔除(堆被縮減)。如果應(yīng)用程序沒有釋放掉厌处,操作系統(tǒng)會(huì)自動(dòng)回收鳖谈。變量通過 new、alloc阔涉、malloc缆娃、realloc 申請(qǐng)分配的內(nèi)存塊就存放在堆區(qū)捷绒。

  • 由程序員分配釋放,分配方式類似于鏈表贯要,是向高地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu)暖侨,是不連續(xù)的內(nèi)存區(qū)域。

三崇渗、全局/靜態(tài)區(qū)

全局/靜態(tài)區(qū) 是存放 全局變量靜態(tài)變量 的字逗。
已初始化的全局變量和靜態(tài)變量存放在一塊區(qū)域。data段
未初始化的全局變量和靜態(tài)變量在相鄰的另一塊區(qū)域宅广。BSS段
由 static 修飾的變量會(huì)成為靜態(tài)變量葫掉,該變量的內(nèi)存由全局/靜態(tài)區(qū)在 編譯階段 完成分配,且僅分配一次跟狱。
static 可以修飾局部變量也可以修飾全局變量俭厚。

  • 全局/靜態(tài)區(qū) 的內(nèi)存在編譯階段完成分配,程序運(yùn)行時(shí)會(huì)一直存在內(nèi)存中驶臊,只有當(dāng)程序結(jié)束后才會(huì)由操作系統(tǒng)釋放挪挤。

四、常量區(qū) -- 數(shù)據(jù)段

常量區(qū) 是一塊比較特殊的存儲(chǔ)區(qū)资铡,常量區(qū)里面存放的是 常量 电禀,常量字符串就存放在常量區(qū)。

  • 常量區(qū) 的內(nèi)存在 編譯階段 完成分配笤休,程序運(yùn)行時(shí)會(huì)一直存在內(nèi)存中尖飞,只有當(dāng)程序結(jié)束后才會(huì)由操作系統(tǒng)釋放。

五店雅、代碼區(qū) -- 代碼段

代碼區(qū) 是用來(lái)存放 可執(zhí)行文件的操作指令(存放函數(shù)的二進(jìn)制代碼)政基,其實(shí)就是存放程序的所有代碼。代碼區(qū) 需要防止在運(yùn)行時(shí)被非法修改闹啦,所以只準(zhǔn)許讀取操作沮明,而不允許寫入(修改)操作——它是不可寫的。

image.png

什么叫做類加載呢窍奋?

我們可以想象荐健,在創(chuàng)建對(duì)象的時(shí)候,肯定是需要訪問類的琳袄,聲明一個(gè)類的指針變量也會(huì)訪問類的江场。
當(dāng)程序運(yùn)行期間,當(dāng)某個(gè)類第一次被訪問到的時(shí)候窖逗,會(huì)將這個(gè)類存儲(chǔ)到內(nèi)存中的代碼段區(qū)域址否,這個(gè)過程就叫做類加載。
只有類在第一次被訪問的時(shí)候碎紊,才會(huì)做類加載佑附。
一旦類被加載到代碼段以后樊诺,直到程序結(jié)束的時(shí)候才會(huì)被釋放。

對(duì)象在內(nèi)存中如何存儲(chǔ)的

假設(shè)下面這句代碼寫在函數(shù)之中:

Person *p1 = [Person new];

Person *p1 會(huì)在棧內(nèi)存中申請(qǐng)一個(gè)空間音同,在棧內(nèi)存中聲明一個(gè)Person類型的指針變量p1词爬。p1是一個(gè)指針變量,那么只能存儲(chǔ)地址瘟斜。

[Person new]缸夹,真正在內(nèi)存中創(chuàng)建對(duì)象的其實(shí)是這句代碼。

new做的事情螺句,

  • 第一是在堆內(nèi)存中申請(qǐng)1塊合適大小的空間虽惭;
  • 第二是在這個(gè)空間中根據(jù)類的模板創(chuàng)建對(duì)象,類模板中定義了什么屬性蛇尚,就把這些屬性依次的聲明在對(duì)象之中; 對(duì)象中還有另外一個(gè)屬性芽唇,叫做isa,它是一個(gè)指針取劫,這個(gè)指針指向這個(gè)對(duì)象所屬的類在代碼段中的地址匆笤;
  • 第三是初始化對(duì)象的屬性。如果屬性的類型是基本數(shù)據(jù)類型谱邪,那么賦值為0炮捧,如果屬性的類型是C語(yǔ)言的指針類型,那么就賦值為NULL惦银,如果屬性的類型是OC的類指針類型咆课,那么就賦值為nil;
  • 第四是返回對(duì)象的地址扯俱,將這個(gè)地址賦值給p1书蚪。

注意:
對(duì)象中只有屬性,而沒有方法迅栅。只有自己所屬類的屬性外加一個(gè)isa指針指向代碼段中的類殊校;

  • 如何訪問對(duì)象的屬性
    指針名(對(duì)象名)->屬性名;
    根據(jù)指針找到指針指向的對(duì)象读存,再找到對(duì)象中的屬性來(lái)訪問
  • 如何調(diào)用方法
    [指針名(對(duì)象名) 方法名];
    先根據(jù)指針名找到對(duì)象为流,對(duì)象發(fā)現(xiàn)要調(diào)用方法,再根據(jù)對(duì)象的isa指針找到類让簿,然后調(diào)用類里的方法

對(duì)象作為類的屬性

image.png

為什么不把方法存儲(chǔ)在對(duì)象中敬察?

因?yàn)槊恳粋€(gè)對(duì)象的方法的代碼實(shí)現(xiàn)都是一模一樣的,沒有必要為每一個(gè)對(duì)象都保存一個(gè)方法拜英,這樣的話就太浪費(fèi)空間了静汤,既然都一樣琅催,那么就保存一份就可以了居凶。

對(duì)象的屬性的默認(rèn)值.

如果我們創(chuàng)建1個(gè)對(duì)象,沒有為對(duì)象的屬性賦值. 那么這個(gè)對(duì)象的屬性是有值的.
如果屬性的類型是基本數(shù)據(jù)類型 默認(rèn)值是0
如果屬性的類型是C指針類型 那么默認(rèn)值是NULL
如果屬性的類型是OC指針類型 那么默認(rèn)值是nil

nil虫给,Nil,NULL侠碧,NSNull抹估,kCFNull 區(qū)別

  • Objective-C實(shí)例對(duì)象指針空值: NSSring *str = nil;
  • Nil 類對(duì)象指針空值: Class class = Nil弄兜;
  • NULL C指針空值: char *p = NULL药蜻; 宏 NULL等價(jià)于0
    只能作為指針變量的值,代表指針不指向內(nèi)存中的任何一塊空間.
  • NSNull 是一個(gè)Objective-C繼承NSObject的類,多用于數(shù)組字典里面的空值
    kCFNull 是NSNull的單例 [NSNull null]

https://zhuanlan.zhihu.com/p/189975215

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末替饿,一起剝皮案震驚了整個(gè)濱河市语泽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌视卢,老刑警劉巖踱卵,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異据过,居然都是意外死亡惋砂,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門绳锅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)西饵,“玉大人,你說我怎么就攤上這事鳞芙【烊幔” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵积蜻,是天一觀的道長(zhǎng)闯割。 經(jīng)常有香客問我,道長(zhǎng)竿拆,這世上最難降的妖魔是什么宙拉? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮丙笋,結(jié)果婚禮上谢澈,老公的妹妹穿的比我還像新娘。我一直安慰自己御板,他們只是感情好锥忿,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著怠肋,像睡著了一般敬鬓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天钉答,我揣著相機(jī)與錄音础芍,去河邊找鬼。 笑死数尿,一個(gè)胖子當(dāng)著我的面吹牛仑性,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播右蹦,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼诊杆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了何陆?” 一聲冷哼從身側(cè)響起晨汹,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎贷盲,沒想到半個(gè)月后宰缤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡晃洒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年慨灭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片球及。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡氧骤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出吃引,到底是詐尸還是另有隱情筹陵,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布镊尺,位于F島的核電站朦佩,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏庐氮。R本人自食惡果不足惜语稠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望弄砍。 院中可真熱鬧仙畦,春花似錦、人聲如沸音婶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)衣式。三九已至寸士,卻和暖如春檐什,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背弱卡。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工厢汹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谐宙。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像界弧,于是被迫代替她去往敵國(guó)和親凡蜻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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

  • OC基礎(chǔ)總結(jié) 重新回過頭看這些基礎(chǔ)知識(shí)垢箕,對(duì)許多知識(shí)點(diǎn)都有新的認(rèn)識(shí)划栓,擁有堅(jiān)實(shí)的基礎(chǔ)才能更快的成長(zhǎng)。 OC內(nèi)存管理 -...
    xx_cc閱讀 2,693評(píng)論 1 21
  • OC對(duì)象的本質(zhì)<一> OC對(duì)象的分類 OC對(duì)象可以分為三類委煤,分別是實(shí)例對(duì)象,類對(duì)象修档,元類對(duì)象碧绞。 實(shí)例對(duì)象(inst...
    雪山飛狐_91ae閱讀 2,473評(píng)論 3 5
  • 學(xué)習(xí)目標(biāo) 1.【理解】對(duì)象在內(nèi)存中的存儲(chǔ) 2.【理解】nil和NULL 3.【了解】#pragma mark分組導(dǎo)...
    Hm丶閱讀 472評(píng)論 0 3
  • 一、內(nèi)存五大區(qū)域: 1.棧(存儲(chǔ)局部變量) 2.堆(程序員手動(dòng)申請(qǐng)的字節(jié)空間 malloc calloc real...
    懵圈de果果閱讀 243評(píng)論 0 0
  • 這篇文章主要想深入介紹一下吱窝,對(duì)于 OC 中的類和對(duì)象的更深層理解讥邻。 分組導(dǎo)航標(biāo)記 在 OC 中有一種特殊語(yǔ)法,可以...
    FutureEye閱讀 694評(píng)論 0 1