我们先修改一下一下NSLog 以方便后面验证
宏定义 :
define TLog(_var)({NSString *name = @#_var; NSLog(@"%@: %@ -> %p:%@",name,[_var class],_var,_var);})
NSString有三种
NSCFConstantString (常量string)
该类型的字符串存放在常量区,retain 或者release不影响应用计数。
我们用的字面量语法(NSSting *str = @"Hello world";)创建的都是这个类型的string
可以用宏定义测试NSCFString (普通string)
该类型的string和普通对象一样,存在堆上,有正常的引用计数。
- NSTaggedPointerString (便签指针string)
苹果在64位环境下对NSString和NSNumber做了优化,将长度较小的字符串直接存放在指针里面,省去了在堆内存开辟空间。对于NSString,当非字面量的数字,英文字母字符串的长度小于等于9的时候会自动成为NSTaggedPointerString类型;当长度大于9或者有中文在里面就会变成NSCFString该类型。便签指针string内容存在指针中,没有对象释放,所以也不会释放
特殊情况 对于 [NSString stringWithFormat:]创建的对象生命周期会延长。
并且类似用工厂方法初始化的生命周期都会延长。
参考:https://suhou.github.io/2017/03/01/由NSString什么时候释放说起/