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的初始化方法


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

NSCFConstantString 和 NSTagerPointerString_第5张图片
屏幕快照 2017-07-29 18.06.14.png

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

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

NSCFConstantString 和 NSTagerPointerString_第7张图片
屏幕快照 2017-07-29 18.11.37.png

NSCFConstantString 和 NSTagerPointerString_第8张图片
屏幕快照 2017-07-29 18.11.45.png

NSCFConstantString 和 NSTagerPointerString_第9张图片
屏幕快照 2017-07-29 18.11.42.png
  • 分析
    从log和断点中可以看出对一个NSCFString进行 retain 和mutablCopy 得到的依然是一个NSCFString类型,但是对它进行copy得到的是一个NSTaggedPointerString类型,从他的log的retainCount值为-1可以看出,它也是一个永远不会被释放的对象
就先这些吧,另外有测试 DEMO 在首页"语法测试"

你可能感兴趣的:(NSCFConstantString 和 NSTagerPointerString)