NSCFConstantString 和 NSTagerPointerString

首先 写了一个宏用来输出响应的内容,主要用来输出isa指针 内存地址 值 retainCount

一 在ARC下的测试

arc下 retainCount 需要通过CFGetRetainCount来得到

#define  TLog(_var) ({NSString * name = @#_var;NSLog(@"%@ : %@ -> %p :%@ %ld",name,[_var class],_var,_var,CFGetRetainCount((__bridge CFTypeRef)_var));})

####我们首先对NSCFConstantString 进行retain copy mutableCopy操作

这个地方会有警告是因为在xcode6之后,就放弃了stringWithString的初始化方法


屏幕快照 2017-07-29 17.42.28.png
屏幕快照 2017-07-29 17.42.37.png
  • 如果是在非arc下进行log的话retainCount的值是-1
  • 从这个地方可以看出来log出来的retainCount是一个很大的值(1152921504606846975),在oc中,如果retaincount是这个值,那么就意味着"无限的retainCount",也就是这个对象是不能被释放的,如果使用第一种方法进行创建string,如果值一样,无论写多少遍都是同一个对象,而且这种对象可以使用== 来进行比较
屏幕快照 2017-07-29 17.42.34.png

在非ARC下进行

  • 修改宏为以下 因为arc下可以使用 retainCount来得到响应的
#define  SLog(_var) ({NSString * name = @#_var;NSLog(@"%@ : %@ -> %p :%@ %ld",name,[_var class],_var,_var,[_var retainCount]);})
屏幕快照 2017-07-29 18.06.06.png

屏幕快照 2017-07-29 18.06.14.png

屏幕快照 2017-07-29 18.06.10.png
  • 分析
    从上述可以看出 s_sting1 是NSCFConstantString类型,对它进行copy,retain 它仍然是NSCFConstantString类型,但是如果对它进行mutableCopy它就会变成NSCFString类型,在第一部分中我们知道NSCFConstantString是不能被释放的

接下来 对NSCFString 进行retain copy mutableCopy操作

屏幕快照 2017-07-29 18.11.37.png

屏幕快照 2017-07-29 18.11.45.png

屏幕快照 2017-07-29 18.11.42.png
  • 分析
    从log和断点中可以看出对一个NSCFString进行 retain 和mutablCopy 得到的依然是一个NSCFString类型,但是对它进行copy得到的是一个NSTaggedPointerString类型,从他的log的retainCount值为-1可以看出,它也是一个永远不会被释放的对象
就先这些吧,另外有测试 DEMO 在首页"语法测试"
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容