NSString的類型

如下代碼關閉了ARC,定義了一個宏,便於咱們查看輸出測試

#define MLog(_var) ({NSString* name = @#_var;NSLog(@"%@: %@ -> %p -> %@ -> %d",name,[_var class],_var,_var,(int)[_var retainCount]);})

測試代碼和結果優化

NSString* aStr = @"123";
    MLog(aStr);
    NSString* bStr = [NSString stringWithFormat:@"123456789"];
    MLog(bStr);
    NSString* cStr = [NSString stringWithFormat:@"1234567890"];
    MLog(cStr);
    /*stringWithFormat:生成的對象,若是長度在10如下,類型是NSTaggedPointerString;若是在10以上,類型是NSCFString*/
    
    NSString* dStr = [cStr retain];
    MLog(dStr);
    NSString* eStr = [cStr copy];
    MLog(eStr);
    
    NSString* fStr = [aStr mutableCopy];
    MLog(fStr);

結果:
 aStr: __NSCFConstantString -> 0x10384a080 -> 123 -> -1
 bStr: NSTaggedPointerString -> 0xa1ea1f72bb30ab19 -> 123456789 -> -1
 cStr: __NSCFString -> 0x60000002b100 -> 1234567890 -> 1
 dStr: __NSCFString -> 0x60000002b100 -> 1234567890 -> 2
 eStr: __NSCFString -> 0x60000002b100 -> 1234567890 -> 3
 fStr: __NSCFString -> 0x600000264140 -> 123 -> 1

能夠看出,NSString有三種類型NSCFConstantString、NSTaggedPointerString和NSCFString.指針

NSCFConstantString是以字面量方式生成的,retainCount是-1,不管copy或者retain都不會變化retainCount的。至關於指針指向一個常量地址。code

NSCFString不屬於常量對象,copy和retain會引發retainCount變化。orm

NSTaggedPointerString是一種Tagged Pointer指針,這種指針是蘋果針對64位實現進行的內存使用優化。copy和retain會引發retainCount變化。對象

相關文章
相關標籤/搜索