NSString 遇到的坑
参考文章
小谈NSString的内存分配
ObjC中怎么判断可变和不可变的坑
我遇到的问题
知识补充:以字面量形式或者 initWithString:
创建出来的字符串是在常量区的,不会释放。以 stringWithFormat:
创建出来的是在堆上。
在这个截图中可以看出来的问题:
- string1 与 string3 是 __NSCFConstantString 类型的,它们是在常量区的。
- string4 是 __NSCFString 类型的,它的地址比 string1 与 string3 高的多,它是在堆上的。
- 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 遇到的坑相关推荐
- UITableView嵌套WKWebView的那些坑
最近项目中遇到了一个需求,TableView中需要嵌套Web页面,我的解决办法是在系统的UITableViewCell中添加WKWebView.开发的过程中,遇到了些坑,写出来分享一下. 1.首先说一 ...
- WKWebView 那些坑
导语 WKWebView 是苹果在 WWDC 2014 上推出的新一代 webView 组件,用以替代 UIKit 中笨重难用.内存泄漏的 UIWebView.WKWebView拥有60fps滚动刷新 ...
- iOS时间格式化遇到的坑
**前言:**最近做项目上传文件到腾讯云,在自己手上的真机上测试没有出现任何问题,提交测试后,也没出现任何问题,都可以上传到腾讯云. 可是从app store下载后,部分客户投诉上传不成功,提示以下错 ...
- iOS11 与 iPhone X适配的那些坑(持更中...)
目录 问题列表 1.适配iPhoneX 屏幕原则 2.适配过程一些常量的设置 3..iPhone X 上运行有黑色区域问题 4.iOS11导航栏适配 5.出现UIScrollview 漂移问题(基本都 ...
- wkwebview 下移20像素_UITableView嵌套WKWebView的那些坑
原标题:UITableView嵌套WKWebView的那些坑 最近项目中遇到了一个需求,TableView中需要嵌套Web页面,我的解决办法是在系统的UITableViewCell中添加WKWebVi ...
- 环信快速集成,以及实际集成中遇到的坑
一.pod集成遇到的问题 1.直接pod 安装 pod 'EaseUI', :git => 'https://github.com/easemob/easeui-ios-hyphenate-co ...
- Xamarin的坑 - 绑定(二) - 高德iOS SDK(.Framework)绑定的一些事
编者语:入门总是用一个hello world,总会让人觉得写code会是很容易的事.开篇绑定了一下微信SDK,不会有太多的难点,可是接下来的这个例子如果欠缺一些耐心,估计你整个人就崩溃了(我从来不会放 ...
- 细数AVPlayer的那些坑
http://ivanyuan.farbox.com/post/shi-pin-bo-fang-de-na-xie-keng 最近一直在做视频动态挂件以及一个视频播放的功能,在开始做之前,先学习了苹果 ...
- iOS WKWebView 那些坑
导语 WKWebView 是苹果在 WWDC 2014 上推出的新一代 webView 组件,用以替代 UIKit 中笨重难用.内存泄漏的 UIWebView.WKWebView 拥有60fps滚动刷 ...
最新文章
- POJ 3174 暴力枚举
- 为什么重新new两个线程线程号相同_面试官每次问我关于线程间通信方法,我都回答的很糟糕...
- 程序员的灯下黑:能认识自己吗?
- 3.6 matlab函数文件的定义与调用
- 求中位数_图解面试题:如何分析中位数?
- Mybatis入门及于hibernate的区别
- django 1.8 官方文档翻译:13-12 验证器
- java创建ssh链接池_HttpClient实战三:Spring整合HttpClient连接池
- 利用爬虫和微信机器人自动刷甘肃教师学苑学分
- 正确使用计算机说课稿,计算机优秀说课稿讲课讲稿.pdf
- Clojure极简教程
- testflight测试的直播软件,TestFlight - Apple
- 写给初学者──如何学习C语言
- 联想台式计算机设置u盘启动不了,联想台式电脑设置bios时U盘、光盘都启动不了是怎么回事?...
- 【CSS】PhotoShop 切图 ② ( PhotoShop 切片选择工具 | 清除切片 | 新建基于图层的切片 | 透明背景图片切图 | 根据参考线选择切片 )
- 软件测试的日常工作是什么
- 菊厂220824第一题
- python--实现Lorenz 63模式
- 数据处理——实现数据过滤
- 2023软工第二次作业-软件案例分析
热门文章
- python - sklearn 计算精准率(Precision)
- 基于Java毕业设计学习类视频网源码+系统+mysql+lw文档+部署软件
- DecimalFormat 保留小数格式化
- Word,Excel的文件如何对比.新旧版本
- html压缩包用什么软件打开方式,分享一招超简单打开zip文件的方法
- 公链求生记:我要干外包
- linux图形图像驱动,Linux_Linux操作系统下USB图像采集驱动的安装,ARMlinux下USB摄像头图像的采集 - phpStudy...
- 我来说说百度的问题吧。。别和谐就行。
- python 隐藏进程_运行进程隐藏的Python
- edge浏览器 F12中文换成英文