首先 写了一个宏用来输出响应的内容,主要用来输出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的初始化方法
- 如果是在非arc下进行log的话retainCount的值是-1
- 从这个地方可以看出来log出来的retainCount是一个很大的值(1152921504606846975),在oc中,如果retaincount是这个值,那么就意味着"无限的retainCount",也就是这个对象是不能被释放的,如果使用第一种方法进行创建string,如果值一样,无论写多少遍都是同一个对象,而且这种对象可以使用== 来进行比较
在非ARC下进行
- 修改宏为以下 因为arc下可以使用 retainCount来得到响应的
#define SLog(_var) ({NSString * name = @#_var;NSLog(@"%@ : %@ -> %p :%@ %ld",name,[_var class],_var,_var,[_var retainCount]);})
- 分析
从上述可以看出 s_sting1 是NSCFConstantString类型,对它进行copy,retain 它仍然是NSCFConstantString类型,但是如果对它进行mutableCopy它就会变成NSCFString类型,在第一部分中我们知道NSCFConstantString是不能被释放的
接下来 对NSCFString 进行retain copy mutableCopy操作
- 分析
从log和断点中可以看出对一个NSCFString进行 retain 和mutablCopy 得到的依然是一个NSCFString类型,但是对它进行copy得到的是一个NSTaggedPointerString类型,从他的log的retainCount值为-1可以看出,它也是一个永远不会被释放的对象