被__weak修飾的NSString

以下代碼輸出結(jié)果如何甘萧?

    NSString *name1 = [NSString stringWithFormat:@"haha"];
    __weak NSString *name2 = name1;
    NSLog(@"name1:%@", name1);
    NSLog(@"name2:%@", name2);
    name1 = nil;
    NSLog(@"name1:%@", name1);
    NSLog(@"name2:%@", name2);
    
    NSString *a1 = [[NSString alloc] initWithFormat:@"haha"];
    __weak NSString *a2 = a1;
    NSLog(@"a1:%@", a1);
    NSLog(@"a2:%@", a2);
    a1 = nil;
    NSLog(@"a1:%@", a1);
    NSLog(@"a2:%@", a2);
    
    NSString *b1 = @"haha";
    __weak NSString *b2 = b1;
    NSLog(@"b1:%@", b1);
    NSLog(@"b2:%@", b2);
    b1 = nil;
    NSLog(@"b1:%@", b1);
    NSLog(@"b2:%@", b2);

結(jié)果:

**2016-08-04 16:11:14.336 xxxxxxxx[677:238940] name1:haha**
**2016-08-04 16:11:14.337 xxxxxxxx[677:238940] name2:haha**
**2016-08-04 16:11:14.337 xxxxxxxx[677:238940] name1:(null)**
**2016-08-04 16:11:14.337 xxxxxxxx[677:238940] name2:haha**
****
****
**2016-08-04 16:11:14.338 xxxxxxxx[677:238940] a1:haha**
**2016-08-04 16:11:14.338 xxxxxxxx[677:238940] a2:haha**
**2016-08-04 16:11:14.338 xxxxxxxx[677:238940] a1:(null)**
**2016-08-04 16:11:14.339 xxxxxxxx[677:238940] a2:(null)**
****
****
**2016-08-04 16:11:14.339 xxxxxxxx[677:238940] b1:haha**
**2016-08-04 16:11:14.339 xxxxxxxx[677:238940] b2:haha**
**2016-08-04 16:11:14.340 xxxxxxxx[677:238940] b1:(null)**
**2016-08-04 16:11:14.340 xxxxxxxx[677:238940] b2:haha**

看到結(jié)果,有點匪夷所思,(name1, a1, b1)置空后杏愤,被__weak修飾的(name2, a2 b2)輸出怎么還會有東西?難道和NSString類型有關(guān)已脓,或者說和NSString的初始化方式有關(guān)珊楼?

如果是NSObject,輸出結(jié)果正常:

    NSObject *obj1=[[NSObject alloc] init];
    __strong NSObject *obj2 = obj1;
    NSLog(@"%@,%@", obj1, obj2);
    obj1 = nil;
    NSLog(@"%@,%@", obj1, obj2);
    
    NSObject *obj3=[[NSObject alloc] init];
    __weak NSObject *obj4 = obj3;
    NSLog(@"%@,%@", obj3, obj4);
    obj3 = nil;
    NSLog(@"%@,%@", obj3, obj4);

輸出結(jié)果正常度液,可看出strong與weak的區(qū)別:strong的對象會使retainCount+1厕宗,而weak不會。 所以第一個例子的retainCount為2堕担,obj1 = nil之后retainCount為1已慢,并不會對obj2造成影響;而第二個例子obj3 = nil后retainCount 為0了霹购,內(nèi)存也跟著釋放了佑惠,所以obj2也為nil。

**2016-08-05 09:32:49.918 xxxxxxxx[766:298464] <NSObject: 0x170b4780>,<NSObject: 0x170b4780>**
**2016-08-05 09:32:49.918 xxxxxxxx[766:298464] (null),<NSObject: 0x170b4780>**
****
**2016-08-05 09:32:49.919 xxxxxxxx[766:298464] <NSObject: 0x15f5d9d0>,<NSObject: 0x15f5d9d0>**
**2016-08-05 09:32:49.919 xxxxxxxx[766:298464] (null),(null)**

NSString也是一個NSObject齐疙,為什么它就不一樣膜楷?(同事的電腦輸出結(jié)果和我的還不一樣,如下圖贞奋,不知什么原因)


tmp1a9fbb26.png
    NSString *str1 = @"q"; // 與[NSString stringWithString:@"q"];等價
    NSString *str2 = [NSString stringWithFormat:@"q"];
    NSString *str3 = [[NSString alloc] initWithFormat:@"q"];
    NSString *str4 = [[NSMutableString alloc] initWithString:@"q"];
    NSLog(@"str1:%@", [str1 class]);
    NSLog(@"str2:%@", [str2 class]);
    NSLog(@"str3:%@", [str3 class]);
    NSLog(@"str4:%@", [str4 class]);

    str1 = @"afdjfdfjle”;
**2016-08-05 16:08:05.302 xxxxxxxxx[875:375798] str1:__NSCFConstantString**
**2016-08-05 16:08:05.303 xxxxxxxxx[875:375798] str2:__NSCFString**
**2016-08-05 16:08:05.303 xxxxxxxxx[875:375798] str3:__NSCFString**
**2016-08-05 16:08:05.303 xxxxxxxxx[875:375798] str4:__NSCFString**
tmp2ed54bee.png

可看出:
1.除str1類型為NSCFString(NSCFConstantString)外赌厅,其他的類型都為NSMutableString;
2.給str1賦值后打一個斷點,重新賦值后再打一個斷點忆矛,觀察str1的內(nèi)存地址發(fā)現(xiàn)已經(jīng)變了察蹲。有點意外吧请垛?按照 C 語言的經(jīng)驗,初始化一個字符串之后洽议,字符串的首地址就被確定下來宗收,不管之后如何修改字符串內(nèi)容,這個地址都不會改變亚兄。但此處第10行并不是對 str1 指向的內(nèi)存地址重新賦值混稽,因為賦值操作符左邊的 str1 是一個指針,也就是說此處修改的是內(nèi)存地址审胚。 所以第10行應(yīng)該這樣理解:將@"afdjfdfjle”當(dāng)做一個新的對象匈勋,將這段對象的內(nèi)存地址賦值給str。


tmp6b54477b.png

tmp2179540e.png
    NSString __weak *string = [[NSString alloc] initWithFormat:@"First Name: %@", @"A"];
    NSLog(@"string:%@", string);
    
    NSString __weak *string2 = @"B";
    NSLog(@"string:%@", string2);
    
    NSString __weak *string3 = [[NSString alloc] initWithString:@"C"];
    NSLog(@"string:%@",string3);
**2016-08-05 09:55:50.923 Decoration[772:303138] string:(null)**
**2016-08-05 09:55:50.923 Decoration[772:303138] string:B**
**2016-08-05 09:55:50.923 Decoration[772:303138] string:C**

解釋:
1.沒有強引用的變量是會被立即釋放的膳叨,所以打印的string會是nil洽洁。
2.下面兩種情況(@""、initWithString)聲明的是常量字符串菲嘴,沒有retainCount(引用計數(shù))饿自,沒有強指針指向它,存在內(nèi)存靜態(tài)區(qū)龄坪,不會被銷毀昭雌,輸出自然會有結(jié)果。


tmp1dc184fa.png

回到最開始的問題:


tmp58031aeb.png

分別在name1, a1, b1 置空前后打一個斷點觀察name2, a2, b2類型的變化健田,輸出結(jié)果應(yīng)該一目了然了吧烛卧。

**(lldb) p name2**
(__NSCFString *) $6 = 0x147c0210 @"haha"
**(lldb) p name2**
(__NSCFString *) $7 = 0x147c0210 @"haha"

**(lldb) p a2**
(__NSCFString *) $8 = 0x1581b480 @"haha"
**(lldb) p a2**
(NSString *) $9 = nil

**(lldb) p b2**
(__NSCFConstantString *) $10 = 0x00844fcc @"haha"
**(lldb) p b2**
(__NSCFConstantString *) $11 = 0x00844fcc @"haha"

NSString特性分析學(xué)習(xí)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市妓局,隨后出現(xiàn)的幾起案子总放,更是在濱河造成了極大的恐慌,老刑警劉巖跟磨,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件间聊,死亡現(xiàn)場離奇詭異,居然都是意外死亡抵拘,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門型豁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來僵蛛,“玉大人,你說我怎么就攤上這事迎变〕湮荆” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵衣形,是天一觀的道長驼侠。 經(jīng)常有香客問我姿鸿,道長,這世上最難降的妖魔是什么倒源? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任苛预,我火速辦了婚禮,結(jié)果婚禮上笋熬,老公的妹妹穿的比我還像新娘热某。我一直安慰自己,他們只是感情好胳螟,可當(dāng)我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布昔馋。 她就那樣靜靜地躺著,像睡著了一般糖耸。 火紅的嫁衣襯著肌膚如雪秘遏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天嘉竟,我揣著相機與錄音邦危,去河邊找鬼。 笑死周拐,一個胖子當(dāng)著我的面吹牛铡俐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播妥粟,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼审丘,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了勾给?” 一聲冷哼從身側(cè)響起滩报,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎播急,沒想到半個月后脓钾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡桩警,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年可训,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捶枢。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡握截,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出烂叔,到底是詐尸還是另有隱情赋兵,我是刑警寧澤末贾,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布上沐,位于F島的核電站,受9級特大地震影響牢裳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜叶沛,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一蒲讯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧恬汁,春花似錦伶椿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至约巷,卻和暖如春偎痛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背独郎。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工踩麦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人氓癌。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓谓谦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親贪婉。 傳聞我的和親對象是個殘疾皇子反粥,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,781評論 2 354

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

  • __block和__weak修飾符的區(qū)別其實是挺明顯的:1.__block不管是ARC還是MRC模式下都可以使用,...
    LZM輪回閱讀 3,310評論 0 6
  • 多線程疲迂、特別是NSOperation 和 GCD 的內(nèi)部原理才顿。運行時機制的原理和運用場景。SDWebImage的原...
    LZM輪回閱讀 2,007評論 0 12
  • ———————————————回答好下面的足夠了---------------------------------...
    恒愛DE問候閱讀 1,717評論 0 4
  • iOS面試小貼士 ———————————————回答好下面的足夠了------------------------...
    不言不愛閱讀 1,980評論 0 7
  • 最近胎動越來越明顯 裘同學(xué)的準(zhǔn)爸爸潛質(zhì)終于被激發(fā)了 每天跟她對話 甚至還會聯(lián)合起來欺負(fù)我 慢慢 踢媽媽 快踢 媽媽...
    PWong閱讀 248評論 0 0