iOS 指針和內(nèi)存塊

在OC中如果不注意指針內(nèi)存塊的問題代承,你可能會遇到一些很奇怪的問題汁蝶,但是卻很難解決,本文將解釋一些在OC中你可能需要了解的知識點(diǎn)论悴。

我們來看這段代碼:

    NSMutableString *str = [@"string1" mutableCopy];
    NSMutableString *str2 = str;
    [str appendString:@"__str"];
    [str appendString:@"__str2"];
    NSLog(@"str1:%@    str2:%@",str,str2);



    //輸出:str1:string1__str__str2    str2:string1__str__str2

我們可以看到str1和str2已經(jīng)是相同的掖棉,因?yàn)?/p>

    NSMutableString *str2 = str;

這段代碼讓str2指向了str1的內(nèi)存塊,也就是說str1和str2現(xiàn)在是對同一塊內(nèi)存的兩個(gè)指向膀估,你可以說他們是一模一樣的幔亥,我們來驗(yàn)證這一點(diǎn):

    NSLog(@"str1:%X  str2:%X",str,str2);
//輸出:str1:B3D96B60  str2:B3D96B60

我們打印了str和str2的內(nèi)存塊,我們發(fā)現(xiàn)的確是一模一樣的察纯。


但很多時(shí)候我們希望得到的是一個(gè)新的對象紫谷,那么這個(gè)時(shí)候我們可以使用“copy,mutableCopy”語法捐寥,copy得到一個(gè)不可變變量笤昨,mutableCopy得到一個(gè)可變變量。
像這樣:

  NSMutableString *str = [@"string1" mutableCopy];
    NSMutableString *str2 = [str mutableCopy];
    [str appendString:@"__str"];
    [str appendString:@"__str2"];
    NSLog(@"str1:%X  str2:%X",str,str2);
    
  //輸出:str1:92F36240  str2:92F36A90

我們用str copy出一個(gè)新的對象握恳,然后打印了他們的地址瞒窒,發(fā)現(xiàn)的確是新的一個(gè)內(nèi)存塊了。


在這里我們需要注意乡洼,所有的字面量語法都是開辟出一個(gè)新的內(nèi)存塊崇裁,包括@"",@[],@{}。
也就是說:

@"" 與[[NSString alloc]init];等價(jià)
@[] 與[[NSArray alloc]init];等價(jià)
@{} 與[[NSDictionary alloc]init];等價(jià)

[@"" mutableCopy]; 與[[NSMutableString alloc] init];等價(jià)
[@[] mutableCopy]; 與[[NSMutableArray alloc] init];等價(jià)
[@{} mutableCopy]; 與[[NSMutableDictionary alloc] init];等價(jià)

也就是說當(dāng)我們用字面量語法對一個(gè)變量賦值時(shí)相當(dāng)于對他重新開辟了內(nèi)存塊束昵,也就是原本的內(nèi)存塊和他是已經(jīng)沒有關(guān)系了拔稳。


在這里順便提一下const修飾符;

    extern NSString * const var;
    extern NSString const * var;

這是兩種不一樣的寫法,結(jié)果肯定也是不一樣的锹雏,區(qū)別也是在于內(nèi)存塊和指針巴比。
const修飾符將其后的變量設(shè)置為常量。

    extern NSString * const var;

當(dāng)const在星號后時(shí)礁遵,var變量的內(nèi)存指針將不能指向其他內(nèi)存轻绞,同時(shí)內(nèi)存塊中的內(nèi)容也將保持不變。

    extern NSString const * var;

而當(dāng)const在星號前面時(shí)佣耐,情況就發(fā)生變化了政勃,var變量的內(nèi)存指針同樣無法指向其他內(nèi)存塊,但是在這種情況下兼砖,var的內(nèi)存塊的內(nèi)存是可以發(fā)生變化的奸远。
也就是說下面這種操作是允許的:

   NSMutableString const * var = [@"str" mutableCopy];
    [var appendString:@"__var"];
    NSLog(@"var:%@",var);
    //輸出:var:str__var

而反過來則是不允許的既棺,關(guān)于這部分內(nèi)容,在本人另一篇文章中有詳細(xì)的解釋:
http://www.strongx.cn/?p=118


更多文章請關(guān)注:http://www.StrongX.cn

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末懒叛,一起剝皮案震驚了整個(gè)濱河市援制,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌芍瑞,老刑警劉巖晨仑,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異拆檬,居然都是意外死亡洪己,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進(jìn)店門竟贯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來答捕,“玉大人,你說我怎么就攤上這事屑那」案洌” “怎么了?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵持际,是天一觀的道長沃琅。 經(jīng)常有香客問我,道長蜘欲,這世上最難降的妖魔是什么益眉? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮姥份,結(jié)果婚禮上郭脂,老公的妹妹穿的比我還像新娘。我一直安慰自己澈歉,他們只是感情好展鸡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著埃难,像睡著了一般莹弊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上凯砍,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天箱硕,我揣著相機(jī)與錄音拴竹,去河邊找鬼悟衩。 笑死,一個(gè)胖子當(dāng)著我的面吹牛栓拜,可吹牛的內(nèi)容都是我干的座泳。 我是一名探鬼主播惠昔,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼挑势!你這毒婦竟也來了镇防?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤潮饱,失蹤者是張志新(化名)和其女友劉穎来氧,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體香拉,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡啦扬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了凫碌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扑毡。...
    茶點(diǎn)故事閱讀 40,015評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖盛险,靈堂內(nèi)的尸體忽然破棺而出瞄摊,到底是詐尸還是另有隱情,我是刑警寧澤苦掘,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布换帜,位于F島的核電站,受9級特大地震影響鹤啡,放射性物質(zhì)發(fā)生泄漏膜赃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一揉忘、第九天 我趴在偏房一處隱蔽的房頂上張望跳座。 院中可真熱鬧,春花似錦泣矛、人聲如沸疲眷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽狂丝。三九已至,卻和暖如春哗总,著一層夾襖步出監(jiān)牢的瞬間几颜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工讯屈, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蛋哭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像鸿脓,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子篓叶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評論 2 355

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

  • iOS面試小貼士 ———————————————回答好下面的足夠了------------------------...
    不言不愛閱讀 1,984評論 0 7
  • 多線程沪蓬、特別是NSOperation 和 GCD 的內(nèi)部原理彤钟。運(yùn)行時(shí)機(jī)制的原理和運(yùn)用場景。SDWebImage的原...
    LZM輪回閱讀 2,007評論 0 12
  • 史上最全的iOS面試題及答案 iOS面試小貼士———————————————回答好下面的足夠了----------...
    Style_偉閱讀 2,356評論 0 35
  • 1.寫一個(gè)NSString類的實(shí)現(xiàn) +(id)initWithCString:(c*****t char *)nu...
    韓七夏閱讀 3,767評論 2 37
  • 最近好多小伙伴跟我聊感情的事情跷叉。我想說:我也是個(gè)小白啊逸雹,遇到喜歡的人也會緊張,也會不知所措云挟。只是心里抗打擊能...
    楊小露閱讀 175評論 0 0