NSSting 詳解

NSSting 類族

NSSting 是一個(gè)類族(Class Clusters),最后生成的對(duì)象類型宗挥,取決于我們調(diào)用的初始化方法(Toll-free bridgin橋接機(jī)制 來實(shí)現(xiàn))

Toll-free bridgin橋接機(jī)制

Toll-free bridging,簡稱為TFB掰派,是一種允許某些ObjC類與其對(duì)應(yīng)的CoreFoundation類(Core Foundation框架 (CoreFoundation.framework) 是一組C語言接口从诲,它們?yōu)閕OS應(yīng)用程序提供基本數(shù)據(jù)管理和服務(wù)功能)之間可以互換使用的機(jī)制。比如 NSString與CFString是橋接(bridged)的, 這意味著可以將任意NSString當(dāng)做CFString使用靡羡,也可以將任意的CFString當(dāng)做NSString使用系洛。

原理(拿NSString舉例)大概是:NSString是一個(gè)抽象類,每當(dāng)你創(chuàng)建一個(gè)NSString實(shí)例亿眠,實(shí)際上是創(chuàng)建的NSString的一個(gè)私有子類實(shí)例碎罚。其中一個(gè)私有子類就是NSCFString,其是CFString類的在ObjC中的對(duì)應(yīng)類。NSCFString實(shí)現(xiàn)了作為NSString需要的所有方法纳像。
我的理解:總之荆烈,你知道有Toll-Free Bridging橋接機(jī)制,然后NSCFString是NSString的私有子類,實(shí)現(xiàn)了它的所有方法憔购。

iOS 支持Toll-free bridgin的類
iOS 支持Toll-free bridgin的類

NSSting 類型:

NSCFConstantString:常量類型宫峦,保存在常量區(qū),有時(shí)候也在棧區(qū)玫鸟,引用計(jì)數(shù)同樣為-1
NSCFString:堆區(qū)导绷, 引用計(jì)數(shù)同樣為 1
NSTaggedPointerString:優(yōu)化的NSCFString,引用計(jì)數(shù)同樣為-1

NSTaggedPointerString (0-9位是taggedpointer類型)
對(duì)于64位程序屎飘,為了節(jié)省內(nèi)存和提高運(yùn)行速度妥曲,蘋果引入了 Tagged Point 技術(shù)
NSTaggedPointerString是對(duì)NSCFString優(yōu)化后的存在钦购,在運(yùn)行時(shí)創(chuàng)建時(shí)對(duì)字符串的內(nèi)容和長度做出判斷檐盟,若字符串內(nèi)容是由ASCII字符構(gòu)成且長度較小(大概十個(gè)字符以內(nèi))押桃,這時(shí)候創(chuàng)建的字符串就是NSTaggedPointerString類型葵萎,字符串直接存儲(chǔ)在指針里,引用計(jì)數(shù)同樣為-1唱凯,不適用對(duì)象的內(nèi)存管理策略羡忘。

//類型=__NSCFConstantString, 地址=0x101d1a098
static NSString *a = @"a";
- (void)test {

    //類型=__NSCFConstantString磕昼, 地址=0x101d1a0d8
    NSString *a0 = @"aaa";
    NSString *a1 = [[NSString alloc] init];
    a0 = @"a0";
    NSString *a2 = [[NSString alloc] initWithString:a0];
    
    //類型=NSTaggedPointerString卷雕, 地址=0x89a6aa09cd52cc1f
    NSString *a3 = [NSString stringWithFormat:@"%s", "str2"];
    NSString *a4 = [NSString stringWithFormat:@"%d", 123];
    NSString *a5 = [NSString stringWithFormat:@"%d", YES];
    
    //類型=__NSCFString, 地址=0x60000032a5a0
    NSString *a6 = [[NSString alloc] initWithFormat:@"aaa"];
    //類型=__NSCFString票从, 地址=0x60000032a520爽蝴,
    NSString *a7 = [NSString stringWithFormat:@"%@", @"aaa"];
    //類型=NSTaggedPointerString, 地址=0x89a6aa09cd52cc1f
    NSString *a8 = [NSString stringWithFormat:@"%@", a3];
    
    //類型=__NSCFString纫骑, 地址=0x600000d70de0
    NSMutableString *a9 = [NSMutableString stringWithFormat:@"%@", a0];
    NSMutableString *a10 = [NSMutableString stringWithFormat:@"%@", a3];
    NSMutableString *a11 = [NSMutableString stringWithFormat:@"%@", a6];
}

結(jié)論:

  1. 普通創(chuàng)建的字符串和 static 字符串都是 NSCFConstantString類型,如:a0 ~ a2九孩。
  2. 使用 initWithFormat 方法創(chuàng)建先馆,參數(shù)為基礎(chǔ)數(shù)據(jù)類型(如:charbool躺彬、int等等)或 NSTaggedPointerString 類型煤墙, 字符串都是 NSTaggedPointerString類型,如:a3~a5宪拥,a8仿野。
  3. 使用initWithFormat 方法創(chuàng)建,參數(shù)為對(duì)象類型的她君,字符串是NSCFString 類型脚作。如 a6~a7 和 a9 ~ a11

Tagged Pointer

Tagged Pointer專門用來存儲(chǔ)小的對(duì)象,例如NSNumberNSDate
Tagged Pointer指針地址保存的其實(shí)是(對(duì)象地址+值)。所以球涛,實(shí)際上它不再是一個(gè)對(duì)象了劣针,它只是一個(gè)披著對(duì)象皮的普通變量而已。所以亿扁,它的內(nèi)存并不存儲(chǔ)在堆中捺典,也不需要mallocfree
在內(nèi)存讀取上有著3倍的效率从祝,創(chuàng)建時(shí)比以前快106倍襟己。
由此看來,NSTaggedPointerString根本不是對(duì)象牍陌,是分配在棧區(qū)的

copy and mutableCopy

@property (nonatomic, strong) NSString *str;
@property (nonatomic, strong) NSString *str1;

@property (nonatomic, copy) NSString *str2;
@property (nonatomic, copy) NSString *str3;

- (void)test {

    //類型=__NSCFConstantString擎浴, 地址=0x10ca08098
    self.str = @"aaa";
    self.str1 = self.str;

    //str   類型=__NSCFConstantString, 地址=0x10ca08098
    //str1  類型=__NSCFConstantString呐赡, 地址=0x10ca08138
    self.str1 = @"bbb";

    //類型=__NSCFConstantString退客, 地址=0x10ca08158
    self.str2 = @"ccc";
    self.str3 = self.str2;

    //類型=__NSCFConstantString, 地址=0x10ca08158
    //類型=__NSCFConstantString链嘀, 地址=0x10ca081b8
    self.str3 = @"ddd";
}

- (void)test1 {

    //類型=__NSCFConstantString萌狂, 地址=0x10ca08098
    self.str = @"aaa";
    self.str1 = [self.str copy];

    //str   類型=__NSCFConstantString, 地址=0x10ca08098
    //str1  類型=__NSCFConstantString怀泊, 地址=0x10ca08138
    self.str1 = @"bbb";

    //類型=__NSCFConstantString茫藏, 地址=0x10ca08158
    self.str2 = @"ccc";
    self.str3 = [self.str2 copy];

    //類型=__NSCFConstantString, 地址=0x10ca08158
    //類型=__NSCFConstantString霹琼, 地址=0x10ca081b8
    self.str3 = @"ddd";
}

- (void)test2 {

    //類型=__NSCFConstantString务傲, 地址=0x10ca08098
    self.str = @"aaa";
    //類型=__NSCFString, 地址=0x600003a60e70
    self.str1 = [self.str mutableCopy];

    //str   類型=__NSCFConstantString枣申, 地址=0x10ca08098
    //str1  類型=__NSCFConstantString售葡, 地址=0x10b926138
    self.str1 = @"bbb";

    //類型=__NSCFConstantString, 地址=0x10ca08158
    self.str2 = @"ccc";
    //類型= NSTaggedPointerString忠藤, 地址=0xaec7592a59dc294c
    self.str3 = [self.str2 mutableCopy];

    //類型=__NSCFConstantString挟伙, 地址=0x10ca08158
    //類型=__NSCFConstantString, 地址=0x10b9261b8
    self.str3 = @"ddd";
}

總結(jié):

  1. 不管是 strong 還是 copy 修飾字符串屬性模孩,使用 = 賦值 和 copy 都會(huì)出現(xiàn) swift 的 寫時(shí)復(fù)制 的效果(而原來學(xué)習(xí)的時(shí)候尖阔,這2個(gè)關(guān)鍵字是深拷貝淺拷貝的區(qū)別,估計(jì)是系統(tǒng)在新版本給做了優(yōu)化)榨咐。
  2. 使用mutableCopy 全部按照深拷貝去實(shí)現(xiàn)介却。
  3. 如果是局部變量,呈現(xiàn)的效果和屬性是一樣的块茁。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末齿坷,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌胃夏,老刑警劉巖轴或,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異仰禀,居然都是意外死亡照雁,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門答恶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來饺蚊,“玉大人,你說我怎么就攤上這事悬嗓∥酆簦” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵包竹,是天一觀的道長燕酷。 經(jīng)常有香客問我,道長周瞎,這世上最難降的妖魔是什么苗缩? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮声诸,結(jié)果婚禮上酱讶,老公的妹妹穿的比我還像新娘。我一直安慰自己彼乌,他們只是感情好泻肯,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著慰照,像睡著了一般灶挟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上毒租,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天膏萧,我揣著相機(jī)與錄音,去河邊找鬼蝌衔。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蝌蹂,可吹牛的內(nèi)容都是我干的噩斟。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼孤个,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼剃允!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤斥废,失蹤者是張志新(化名)和其女友劉穎椒楣,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體牡肉,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡捧灰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了统锤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片毛俏。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖饲窿,靈堂內(nèi)的尸體忽然破棺而出煌寇,到底是詐尸還是另有隱情,我是刑警寧澤逾雄,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布阀溶,位于F島的核電站,受9級(jí)特大地震影響鸦泳,放射性物質(zhì)發(fā)生泄漏银锻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一辽故、第九天 我趴在偏房一處隱蔽的房頂上張望徒仓。 院中可真熱鬧,春花似錦誊垢、人聲如沸掉弛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽殃饿。三九已至,卻和暖如春芋肠,著一層夾襖步出監(jiān)牢的瞬間乎芳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來泰國打工帖池, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留奈惑,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓睡汹,卻偏偏與公主長得像肴甸,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子囚巴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

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