前段時間看了同事的分享,于是把它記錄下來
先看下這幾個測試代碼,關于 NSString:
NSString *a = @"abc";
NSString *b = [[NSString alloc] init];
NSString *c = [[NSString alloc] initWithString:@"abc"];
NSString *d = [[NSString alloc] initWithFormat:@"abc"];
NSString *e = [NSString stringWithFormat:@"abc"];
NSString *f = [NSString stringWithFormat:@"123456789"];
NSString *g = [NSString stringWithFormat:@"1234567890"];
執(zhí)行后打印輸出結果:
變量名=a,類型=__NSCFConstantString
變量名=b,類型=__NSCFConstantString
變量名=c,類型=__NSCFConstantString
變量名=d,類型=NSTaggedPointerString
變量名=e,類型=NSTaggedPointerString
變量名=f,類型=NSTaggedPointerString
變量名=g,類型=__NSCFString
可以看出 NSString 是有幾種類型的:
-
__NSCFConstantString
文字常量區(qū)存放常量字符串,程序結束后由系統(tǒng)釋放,也就是說指向常量表的指針不受引用計數(shù)管理。所以對于NSCFConstantString類型的變量,OC 的內存管理策略對其無效 -
NSTaggedPointerString
對于64位程序,為了節(jié)省內存和提高運行速度,蘋果引入了 Tagged Point 技術。NSTaggedPointerString是對NSCFString優(yōu)化后的存在,在運行時創(chuàng)建時對字符串的內容和長度做出判斷,若字符串內容是由ASCII字符構成且長度較?。ù蟾攀畟€字符以內),這時候創(chuàng)建的字符串就是NSTaggedPointerString類型,字符串直接存儲在指針里,引用計數(shù)同樣為-1,不適用對象的內存管理策略 -
Tagged Pointer
它的指針的值不再是地址了,而是真正的值。所以,實際上它不再是一個對象了,它只是一個披著對象皮的普通變量而已。所以,它的內存并不存儲在堆中,OC 對象的內存管理方式對其無效。 -
__NSCFString
表示這是一個對象類型的字符串,在運行時創(chuàng)建,存儲在堆區(qū),服從OC 的對象內存管理策略。
我們可以看下面這張圖:

NSString 內存管理方式
關于NSString是不是還有很多驚喜呢?歡迎補充