NSString 释放问题

我们先修改一下一下NSLog 以方便后面验证
宏定义 :

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

NSString有三种

  1. NSCFConstantString (常量string)
    该类型的字符串存放在常量区,retain 或者release不影响应用计数。
    我们用的字面量语法(NSSting *str = @"Hello world";)创建的都是这个类型的string
    可以用宏定义测试

  2. NSCFString (普通string)
    该类型的string和普通对象一样,存在堆上,有正常的引用计数。

  1. NSTaggedPointerString (便签指针string)
    苹果在64位环境下对NSString和NSNumber做了优化,将长度较小的字符串直接存放在指针里面,省去了在堆内存开辟空间。对于NSString,当非字面量的数字,英文字母字符串的长度小于等于9的时候会自动成为NSTaggedPointerString类型;当长度大于9或者有中文在里面就会变成NSCFString该类型。便签指针string内容存在指针中,没有对象释放,所以也不会释放

特殊情况 对于 [NSString stringWithFormat:]创建的对象生命周期会延长。
并且类似用工厂方法初始化的生命周期都会延长。

参考:https://suhou.github.io/2017/03/01/由NSString什么时候释放说起/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容