如下代碼關閉了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變化。對象