NSString內(nèi)存小結(jié)瑟慈,以及isEqual與isEqualToString的研究

思考

一言不合先上個(gè)小小的思考吧

NSString *str0 = @"1";
NSString *str1 = [NSString stringWithFormat:@"1"];//
    
NSLog(@"%d", str0 == str1);
NSLog(@"%d", [str0 isEqualToString:str1]);
NSLog(@"%d", [str0 isEqual:str1]);

大家可以短暫的思索下輸出的結(jié)果脾拆,后面我們?cè)僬f

關(guān)于NSString內(nèi)存

帶著測(cè)試來看吧

NSString *str0 = @"1";
NSString *str1 = [NSString stringWithFormat:@"1"];//
NSString *str2 = [[NSString alloc] initWithString:@"1"];//
NSMutableString *str3 = [[NSMutableString alloc] initWithString:@"1"];//
NSString *strs0copy = str0.copy;
NSString *str3copy = str3.copy;
NSString *str0mucopy = str0.mutableCopy;
NSString *str00mucopy = str0.mutableCopy;

NSLog(@"str0:%p", str0);
NSLog(@"str1:%p", str1);
NSLog(@"str2:%p", str2);
NSLog(@"strs0copy:%p", strs0copy);
NSLog(@"str3:%p", str3);
NSLog(@"str3copy:%p", str3copy);
NSLog(@"str0mucopy:%p", str0mucopy);
NSLog(@"str00mucopy:%p", str00mucopy);
    

我們看下輸出的結(jié)果以及堆棧信息

2017-06-08 15:50:52.198 NSString_ memory[68403:4037182] str0:0x103513068
2017-06-08 15:50:52.199 NSString_ memory[68403:4037182] str1:0xa000000000000311
2017-06-08 15:50:52.199 NSString_ memory[68403:4037182] str2:0x103513068
2017-06-08 15:50:52.199 NSString_ memory[68403:4037182] strs0copy:0x103513068
2017-06-08 15:50:52.199 NSString_ memory[68403:4037182] str3:0x618000263c00
2017-06-08 15:50:52.199 NSString_ memory[68403:4037182] str3copy:0xa000000000000311
2017-06-08 15:50:52.199 NSString_ memory[68403:4037182] str0mucopy:0x618000263bc0
2017-06-08 15:50:52.200 NSString_ memory[68403:4037182] str00mucopy:0x618000263b80

堆棧信息

屏幕快照 2017-06-08 下午7.37.40.png

上面我們看出str0、str2下翎、strs0copy的內(nèi)存地址是一樣的

str1和str3copy是一樣的

堆棧信息告訴我們str0混稽、str2采驻、strs0copy的類型是__NSCFConstantString审胚;字符串常量存儲(chǔ)區(qū),字面量相等的共用一塊常量存儲(chǔ)地址匈勋,常量區(qū)的copy操作是淺拷貝依然相同地址

對(duì)于str2的寫法,編譯器會(huì)報(bào)一警告,警告我們str2的字面量賦值是多余的膳叨,默認(rèn)會(huì)給我們str0的形式,str2依然是在常量區(qū)洽洁;

str1和str3copy的類型是NSTaggedPointerString,跟字面量的值密切相關(guān)菲嘴,是在棧上

其余的str3饿自、str0mucopy、str00mucopy則是__NSCFString,堆分配

關(guān)于NSTaggedPointerString的解釋參考
【譯】采用Tagged Pointer的字符串
深入理解Tagged Pointer

isEqualToString龄坪、isEqual

isEqual比較兩個(gè)兩個(gè)對(duì)象是否相等
來看下isEqual的源碼

- (BOOL)isEqual:(id)obj {
    return obj == self;
}

回過頭昭雌,我們看開頭的輸出結(jié)果分別是0、1健田、1烛卧,既然str0和str1的內(nèi)存地址是不一樣的,那為什么isEqual會(huì)相等呢妓局,那就是NSString內(nèi)部重寫了isEqual总放,雖然拿不到官方的源碼,我們可以看下GNUstep Base源碼一定程度可以作為一個(gè)參考

- (BOOL) isEqual: (id)anObject
{
  if (anObject == self)
    {
      return YES;
    }
  if (anObject != nil && [anObject isKindOfClass: NSStringClass])
    {
      return [self isEqualToString: anObject];
    }
  return NO;
}

內(nèi)存不等的情況下比較的說isEqualToString好爬,這樣我們就明白了
我們?cè)倏聪耰sEqualToString

- (BOOL) isEqualToString: (NSString*)aString
{
  if (aString == self)
    {
      return YES;
    }
  if ([self hash] != [aString hash])
    {
      return NO;
    }
  if (strCompNsNs(self, aString, 0, (NSRange){0, [self length]})
    == NSOrderedSame)
    {
      return YES;
    }
  return NO;
}

首先是否相等比較局雄,然后比較hash值,最后比較字面量是否相同存炮。
至此回到開頭我們蕩然于胸了炬搭。
當(dāng)然對(duì)于我們自定義對(duì)象的比較可以重寫- (BOOL) isEqual:和- (NSUInteger)hash蜈漓,當(dāng)然這里就不展開balabala了

后記

以上也是隨手看某一源碼隨手細(xì)致的琢磨了下,有不同見解的歡迎指出宫盔,生命在于折騰尤其在我大天朝=迎变。=

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市飘言,隨后出現(xiàn)的幾起案子衣形,更是在濱河造成了極大的恐慌,老刑警劉巖姿鸿,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谆吴,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡苛预,警方通過查閱死者的電腦和手機(jī)句狼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來热某,“玉大人腻菇,你說我怎么就攤上這事∥舨觯” “怎么了筹吐?”我有些...
    開封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長秘遏。 經(jīng)常有香客問我丘薛,道長,這世上最難降的妖魔是什么邦危? 我笑而不...
    開封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任洋侨,我火速辦了婚禮,結(jié)果婚禮上倦蚪,老公的妹妹穿的比我還像新娘希坚。我一直安慰自己,他們只是感情好陵且,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開白布裁僧。 她就那樣靜靜地躺著,像睡著了一般滩报。 火紅的嫁衣襯著肌膚如雪锅知。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天脓钾,我揣著相機(jī)與錄音售睹,去河邊找鬼。 笑死可训,一個(gè)胖子當(dāng)著我的面吹牛昌妹,可吹牛的內(nèi)容都是我干的捶枢。 我是一名探鬼主播,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼飞崖,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼烂叔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起固歪,我...
    開封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤蒜鸡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后牢裳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體逢防,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年蒲讯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了忘朝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡判帮,死狀恐怖局嘁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情晦墙,我是刑警寧澤悦昵,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站偎痛,受9級(jí)特大地震影響旱捧,放射性物質(zhì)發(fā)生泄漏独郎。R本人自食惡果不足惜踩麦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望氓癌。 院中可真熱鬧谓谦,春花似錦、人聲如沸贪婉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽疲迂。三九已至才顿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間尤蒿,已是汗流浹背郑气。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留腰池,地道東北人尾组。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓忙芒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親讳侨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子呵萨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

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

  • 1.概述 對(duì)于 Java 的開發(fā)者來說,在虛擬機(jī)的自動(dòng)內(nèi)存管理機(jī)制的幫助下跨跨,不再需要為每一個(gè) new 操作去寫配對(duì)...
    SawyerZh閱讀 3,174評(píng)論 3 81
  • 在函數(shù)中定義的一些基本類型的變量和對(duì)象的引用變量都在函數(shù)的棧內(nèi)存中分配潮峦。 當(dāng)在一段代碼塊定義一個(gè)變量時(shí),Java就...
    木有魚丸啦閱讀 556評(píng)論 0 0
  • weihengli閱讀 138評(píng)論 0 0
  • 莫蘭蒂勇婴,還不能完整地記住這個(gè)暴烈的名字跑杭,但不得不承認(rèn)是他,確確實(shí)實(shí)地撼動(dòng)這天的凌晨的廈門咆耿。模模糊糊德谅,以為臺(tái)風(fēng)也不過...
    悶在自由里的魚閱讀 121評(píng)論 0 0
  • 我還喜歡著你,但是少了非要在一起的理由萨螺。 能知道你的境況窄做,偶爾和你聊著有點(diǎn)尬的天 挺好的,不奢求著我們以后能咋樣 ...
    賴皮懶貓兒閱讀 132評(píng)論 0 0