NSString的引用计数比较特殊
以下是创建NSString的几种方法:
NSString buffer1 = @"hello world";TLog(buffer1);
NSString buffer2 = [NSString stringWithString:@"hello world"];
TLog(buffer2);
NSString buffer3 = [[NSString alloc] initWithString:@"hello world"];
TLog(buffer3);
NSString buffer4 = [NSString stringWithFormat:@"hello world"];
TLog(buffer4);
NSString buffer5 = [[NSString alloc]initWithFormat:@"hello world"];
TLog(buffer5);
打印宏1、isa2、类名3、地址4、值5、retainCount(#define TLog(_var) ({ NSString name = @#_var; NSLog(@"%@: %@ -> %p : %@ %lu", name, [_var class], _var, _var, (unsigned long)[_var retainCount]); })
)
运行打印结果:
buffer1: NSCFConstantString -> 0x10b4c7050 : hello world 18446744073709551615
buffer2: NSCFConstantString -> 0x10b4c7050 : hello world 18446744073709551615
buffer3: NSCFConstantString -> 0x10b4c7050 : hello world 18446744073709551615
buffer4: NSCFString -> 0x60000003b6e0 : hello world 1
buffer5: __NSCFString -> 0x60000003b7e0 : hello world 1
前三种(第二种方法已经被遗弃,使用会有警告⚠️)创建出来的isa是NSCFConstantString 引用计数无数大(如果用int类型打印是-1)是无法释放的所有的 NSCFConstantString对象的retainCount都为-1,这就意味着 __NSCFConstantString不会被释放
后两种和创建其他object是一样的在堆中占有内存,引用计数为1
NSString的retain、copy和mutableCopy
NSString str1 = @"abcd"; TLog(str1);
NSString str2 = [str1 retain]; TLog(str2);
NSString str3 = [str1 copy]; TLog(str3);
NSString str4 = [str1 mutableCopy]; TLog(str4);
打印结果:
str1: NSCFConstantString -> 0x1093c5050 : abcd 18446744073709551615
str2: NSCFConstantString -> 0x1093c5050 : abcd 18446744073709551615
str3: NSCFConstantString -> 0x1093c5050 : abcd 18446744073709551615
str4: NSCFString -> 0x60000026e0c0 : abcd 1
copy的还是原来的对象,并没有新copy一个(浅copy)mutableCopy相当于直接复制成为另一个对象(深copy)在堆中申请内存,retainCount为1