一个了解内存特性的宏

为了方便测试,我先写了个宏,用来打印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.

你可能感兴趣的:(一个了解内存特性的宏)