NSArray/NSMutableArray 的內(nèi)存分布以及擴(kuò)容分析

一界弧、NSArray

NSArray創(chuàng)建的是不可變對象的數(shù)組凿跳,即一旦創(chuàng)建了一個(gè)包含特定數(shù)量的對象的數(shù)組良拼,就不能對數(shù)組進(jìn)行添加呜呐、刪除元素的操作就斤。
為了方便觀察NSArray的內(nèi)存分布,在NSArray對象中存儲(chǔ)同一個(gè)字符串:

    NSString *str = @"11";
    NSLog(@"字符串常量的地址  %p", str);
    NSArray *array = @[str, str, str, str, str];

    // 字符串常量的地址  0x108cc2360

str是字符串常量蘑辑,所以指向的地址是固定的洋机。然后利用x/100xb array指令觀察array內(nèi)存分布

image.png

  • 從圖中很明顯發(fā)現(xiàn),第三行到第七行所存儲(chǔ)地址正好就是字符串常量的地址洋魂。
  • 根據(jù)OC對象的定義绷旗,前8個(gè)字節(jié)(對應(yīng)第一行內(nèi)容),是isa(包含對象信息副砍、引用計(jì)數(shù)衔肢、類指針...)
    image.png
  • 經(jīng)過多次調(diào)試,可以發(fā)現(xiàn)第二行地址存儲(chǔ)的為數(shù)組的長度豁翎。
    所以很明顯角骤,NSArray創(chuàng)建時(shí),會(huì)根據(jù)所存儲(chǔ)內(nèi)容申請一片連續(xù)的空間心剥,也由于這種內(nèi)存分配方式邦尊,不方便進(jìn)行內(nèi)存調(diào)整,也符合了不可變數(shù)組的定義优烧。

一蝉揍、NSMutableArray

NSMutableArray 繼承自 NSArray,是一個(gè)可變數(shù)組匙隔,可以對數(shù)組的元素進(jìn)行增刪改查疑苫。
通NSArray一樣熏版,在NSMutableArray對象中存儲(chǔ)同一個(gè)字符串:

    NSString *str = @"11";
    NSLog(@"字符串常量的地址  %p", str);
    NSMutableArray *array = [NSMutableArray arrayWithCapacity:1];
    for (int i = 0; i < 10; i ++) {
        [array addObject:@"11"];
    }
    // 字符串常量的地址  0x10043e360
image.png
  • 和NSArray類似,第一行存儲(chǔ)的依然isa
  • 內(nèi)存中并沒有找到字符串常量的地址捍掺,經(jīng)猜測和調(diào)試驗(yàn)證撼短,數(shù)組中的內(nèi)容單獨(dú)存儲(chǔ)在另外一塊連續(xù)空間中,再將數(shù)組元素首地址存在在數(shù)組中挺勿;
    image.png

    根據(jù)內(nèi)存分布情況曲横,可以通過修改指針直接獲取內(nèi)存中的值,通過下面代碼可分別獲取數(shù)組內(nèi)容首地址的值和數(shù)組容量capacity的值
@implementation NSArray (address)

- (void *)elementsAddress {
    void *address = (__bridge void *)self;
    return *((void **)address + 2);
}

- (int)capacity {
    void *address = (__bridge void *)self;
    return *((int *)address + 7);
}

@end

image.png

通過多次調(diào)試不瓶,可發(fā)現(xiàn)禾嫉,數(shù)組擴(kuò)容的規(guī)律,也并不是網(wǎng)上所說的容量不夠時(shí)蚊丐,會(huì)申請一塊雙倍容量的空間熙参。而且通過arrayWithCapacity方法創(chuàng)建時(shí),會(huì)提前申請一塊連續(xù)的空間麦备,節(jié)省了很多擴(kuò)容的操作孽椰,但是并不一定和傳遞進(jìn)去的容量一致(例如參數(shù)為100時(shí),實(shí)際容量只有16)凛篙。
所以數(shù)組通過這種間接指向的方式黍匾,可以方便的進(jìn)行擴(kuò)容,以及數(shù)據(jù)的修改呛梆。
數(shù)組擴(kuò)容流程:

  • 申請一塊新的空間
  • 將原數(shù)據(jù)拷貝到新的地址中去
  • 釋放原數(shù)據(jù)存儲(chǔ)空間锐涯,并將指針指向新的內(nèi)存區(qū)域

文中用到的x指令,是memory read的縮寫填物,其中b代表以字節(jié)為單位進(jìn)行打印纹腌,x代表以16位格式顯示數(shù)據(jù)。x/100xb array就代表打印array地址開始的100個(gè)字節(jié)的內(nèi)容以16位格式顯示

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末融痛,一起剝皮案震驚了整個(gè)濱河市壶笼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌雁刷,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件保礼,死亡現(xiàn)場離奇詭異沛励,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)炮障,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門目派,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人胁赢,你說我怎么就攤上這事企蹭。” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵谅摄,是天一觀的道長徒河。 經(jīng)常有香客問我,道長送漠,這世上最難降的妖魔是什么顽照? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮闽寡,結(jié)果婚禮上代兵,老公的妹妹穿的比我還像新娘。我一直安慰自己爷狈,他們只是感情好植影,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著涎永,像睡著了一般何乎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上土辩,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天支救,我揣著相機(jī)與錄音,去河邊找鬼拷淘。 笑死各墨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的启涯。 我是一名探鬼主播贬堵,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼结洼!你這毒婦竟也來了黎做?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤松忍,失蹤者是張志新(化名)和其女友劉穎蒸殿,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鸣峭,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宏所,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了摊溶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片爬骤。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖莫换,靈堂內(nèi)的尸體忽然破棺而出霞玄,到底是詐尸還是另有隱情骤铃,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布坷剧,位于F島的核電站惰爬,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏听隐。R本人自食惡果不足惜补鼻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望雅任。 院中可真熱鬧风范,春花似錦、人聲如沸沪么。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽禽车。三九已至寇漫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間殉摔,已是汗流浹背州胳。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留逸月,地道東北人栓撞。 一個(gè)月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像碗硬,于是被迫代替她去往敵國和親瓤湘。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353