NSString引用计数分析

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值