参考文章

小谈NSString的内存分配

ObjC中怎么判断可变和不可变的坑

我遇到的问题

知识补充:以字面量形式或者 initWithString: 创建出来的字符串是在常量区的,不会释放。以 stringWithFormat: 创建出来的是在堆上。

在这个截图中可以看出来的问题:

  1. string1 与 string3 是 __NSCFConstantString 类型的,它们是在常量区的。
  2. string4 是 __NSCFString 类型的,它的地址比 string1 与 string3 高的多,它是在堆上的。
  3. string2 是 NSTaggedPointerString 类型的。它的地址的第一位位是 a (十六进制),如果在二进制下,这个地址的首位为 1。地址首位为 1,在 iOS 平台下,就是 TaggedPointer 处理过的(看源码可以知道)。

问题一

@property (nonatomic, copy) NSString * name;
for (int i = 0; i < 1000; i++) {dispatch_async(dispatch_get_global_queue(0, 0), ^{self.name = [NSString stringWithFormat:@"abcdefghij"];});
}
复制代码
for (int i = 0; i < 1000; i++) {dispatch_async(dispatch_get_global_queue(0, 0), ^{self.name = [NSString stringWithFormat:@"abcdefghi"];});
}
复制代码

第一段代码会崩溃,因为在 - setName: 方法中多次释放 _name。
第二段代码不会崩溃,它与第一个不同的是,这个字符串比较短,采用的是 taggedpointer 技术。 它为什么不崩溃,暂时不太理解?我打上断点发现每次都会进入- setName: 方法,那么每次进来都会有 release 才对。

问题二

for (int i = 0; i < 1000; i++) {dispatch_async(dispatch_get_global_queue(0, 0), ^{self.name = @"abcdefghij";});
}
复制代码

这段代码是使用的比更长的那个字符串。
这段代码也不会崩溃。
它是创建在常量区的。
它为什么不崩溃,我也不知道。

问题三

NSString *string = [NSString stringWithFormat:@"abcdefghij"];
for (int i = 0; i < 1000; i++) {dispatch_async(dispatch_get_global_queue(0, 0), ^{self.name = string;});
}
复制代码

这段代码也是使用的比较长的那个字符串。在第一段代码中,它崩了,在这段里面,它没崩。为什么?

NSString 遇到的坑相关推荐

  1. UITableView嵌套WKWebView的那些坑

    最近项目中遇到了一个需求,TableView中需要嵌套Web页面,我的解决办法是在系统的UITableViewCell中添加WKWebView.开发的过程中,遇到了些坑,写出来分享一下. 1.首先说一 ...

  2. WKWebView 那些坑

    导语 WKWebView 是苹果在 WWDC 2014 上推出的新一代 webView 组件,用以替代 UIKit 中笨重难用.内存泄漏的 UIWebView.WKWebView拥有60fps滚动刷新 ...

  3. iOS时间格式化遇到的坑

    **前言:**最近做项目上传文件到腾讯云,在自己手上的真机上测试没有出现任何问题,提交测试后,也没出现任何问题,都可以上传到腾讯云. 可是从app store下载后,部分客户投诉上传不成功,提示以下错 ...

  4. iOS11 与 iPhone X适配的那些坑(持更中...)

    目录 问题列表 1.适配iPhoneX 屏幕原则 2.适配过程一些常量的设置 3..iPhone X 上运行有黑色区域问题 4.iOS11导航栏适配 5.出现UIScrollview 漂移问题(基本都 ...

  5. wkwebview 下移20像素_UITableView嵌套WKWebView的那些坑

    原标题:UITableView嵌套WKWebView的那些坑 最近项目中遇到了一个需求,TableView中需要嵌套Web页面,我的解决办法是在系统的UITableViewCell中添加WKWebVi ...

  6. 环信快速集成,以及实际集成中遇到的坑

    一.pod集成遇到的问题 1.直接pod 安装 pod 'EaseUI', :git => 'https://github.com/easemob/easeui-ios-hyphenate-co ...

  7. Xamarin的坑 - 绑定(二) - 高德iOS SDK(.Framework)绑定的一些事

    编者语:入门总是用一个hello world,总会让人觉得写code会是很容易的事.开篇绑定了一下微信SDK,不会有太多的难点,可是接下来的这个例子如果欠缺一些耐心,估计你整个人就崩溃了(我从来不会放 ...

  8. 细数AVPlayer的那些坑

    http://ivanyuan.farbox.com/post/shi-pin-bo-fang-de-na-xie-keng 最近一直在做视频动态挂件以及一个视频播放的功能,在开始做之前,先学习了苹果 ...

  9. iOS WKWebView 那些坑

    导语 WKWebView 是苹果在 WWDC 2014 上推出的新一代 webView 组件,用以替代 UIKit 中笨重难用.内存泄漏的 UIWebView.WKWebView 拥有60fps滚动刷 ...

最新文章

  1. POJ 3174 暴力枚举
  2. 为什么重新new两个线程线程号相同_面试官每次问我关于线程间通信方法,我都回答的很糟糕...
  3. 程序员的灯下黑:能认识自己吗?
  4. 3.6 matlab函数文件的定义与调用
  5. 求中位数_图解面试题:如何分析中位数?
  6. Mybatis入门及于hibernate的区别
  7. django 1.8 官方文档翻译:13-12 验证器
  8. java创建ssh链接池_HttpClient实战三:Spring整合HttpClient连接池
  9. 利用爬虫和微信机器人自动刷甘肃教师学苑学分
  10. 正确使用计算机说课稿,计算机优秀说课稿讲课讲稿.pdf
  11. Clojure极简教程
  12. testflight测试的直播软件,TestFlight - Apple
  13. 写给初学者──如何学习C语言
  14. 联想台式计算机设置u盘启动不了,联想台式电脑设置bios时U盘、光盘都启动不了是怎么回事?...
  15. 【CSS】PhotoShop 切图 ② ( PhotoShop 切片选择工具 | 清除切片 | 新建基于图层的切片 | 透明背景图片切图 | 根据参考线选择切片 )
  16. 软件测试的日常工作是什么
  17. 菊厂220824第一题
  18. python--实现Lorenz 63模式
  19. 数据处理——实现数据过滤
  20. 2023软工第二次作业-软件案例分析

热门文章

  1. python - sklearn 计算精准率(Precision)
  2. 基于Java毕业设计学习类视频网源码+系统+mysql+lw文档+部署软件
  3. DecimalFormat 保留小数格式化
  4. Word,Excel的文件如何对比.新旧版本
  5. html压缩包用什么软件打开方式,分享一招超简单打开zip文件的方法
  6. 公链求生记:我要干外包
  7. linux图形图像驱动,Linux_Linux操作系统下USB图像采集驱动的安装,ARMlinux下USB摄像头图像的采集 - phpStudy...
  8. 我来说说百度的问题吧。。别和谐就行。
  9. python 隐藏进程_运行进程隐藏的Python
  10. edge浏览器 F12中文换成英文