为了方便测试,我先写了个宏,用来打印NSString的isa、内存地址、值、retainCount。 注:为了了解内存特性,后面的代码都使用了手动内存管理。
#define TLog(_var) ({ NSString *name = @#_var; NSLog(@"%@: %@ -> %p : %@ %d", name, [_var class], _var, _var, (int)[_var retainCount]); })
NSString *str1 = @"1234567890";
TLog(str1);
//str1: __NSCFConstantString -> 0x715ec : 1234567890 -1
NSString *str2 = [NSString stringWithString:@"1234567890"];
TLog(str2);
//str2: __NSCFConstantString -> 0x715ec : 1234567890 -1
NSString *str3 = [NSString stringWithFormat:@"1234567890"];
TLog(str3);
//str3: __NSCFString -> 0x1557cb50 : 1234567890 1
NSString *str1 = @"a"; TLog(str1);
NSString *str2 = [str1 retain]; TLog(str2);
NSString *str3 = [str1 copy]; TLog(str3);
NSString *str4 = [str1 mutableCopy]; TLog(str4);
/*
str1: __NSCFConstantString -> 0x7c5e0 : a -1
str2: __NSCFConstantString -> 0x7c5e0 : a -1
str3: __NSCFConstantString -> 0x7c5e0 : a -1
str4: __NSCFString -> 0x1559eb80 : a 1
*/
上面的测试可以看出,对一个__NSCFConstantString进行retain和copy操作都还是自己,没有任何变化,对其mutableCopy操作可将其拷贝到堆上,retainCount为1.