前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从一道网易面试题浅谈 Tagged Pointer

从一道网易面试题浅谈 Tagged Pointer

作者头像
零式的天空
发布2022-03-25 11:56:16
3210
发布2022-03-25 11:56:16
举报
文章被收录于专栏:零域Blog

前言

这篇博客九月就想写了,因为赶项目拖了到现在,抓住17年尾巴写吧~

正文

上次看了一篇 《从一道网易面试题浅谈OC线程安全》 的博客,主要内容是:

作者去网易面试,面试官出了一道面试题:下面代码会发生什么问题?

代码语言:javascript
复制
@property (nonatomic, strong) NSString *target;
//....
dispatch_queue_t queue = dispatch_queue_create("parallel", DISPATCH_QUEUE_CONCURRENT);
for (int i = 0; i < 1000000 ; i++) {
    dispatch_async(queue, ^{
        self.target = [NSString stringWithFormat:@"ksddkjalkjd%d",i];
    });
}

答案是:会 crash。

我们来看看对target属性(strong修饰)进行赋值,相当与 MRC 中的

代码语言:javascript
复制
- (void)setTarget:(NSString *)target {
    if (target == _target) return;
    id pre = _target;
    [target retain];//1.先保留新值
    _target = target;//2.再进行赋值
    [pre release];//3.释放旧值
}

因为在 并行队列 DISPATCH_QUEUE_CONCURRENT异步 dispatch_asynctarget属性进行赋值,就会导致 target 已经被 release了,还会执行 release。这就是向已释放内存对象发送消息而发生 crash 。

但是

我敲了这段代码,执行的时候发现并不会 crash~

代码语言:javascript
复制
@property (nonatomic, strong) NSString *target;
dispatch_queue_t queue = dispatch_queue_create("parallel", DISPATCH_QUEUE_CONCURRENT);
for (int i = 0; i < 1000000 ; i++) {
    dispatch_async(queue, ^{
    	// ‘ksddkjalkjd’删除了
        self.target = [NSString stringWithFormat:@"%d",i];
    });
}

原因就出在对 self.target 赋值的字符串上。博客的最后也提到了 - ‘上述代码的字符串改短一些,就不会崩溃’,还有 Tagged Pointer 这个东西。

我们将上面的代码修改下:

代码语言:javascript
复制
NSString *str = [NSString stringWithFormat:@"%d", i];
NSLog(@"%d, %s, %p", i, object_getClassName(str), str);
self.target = str;

输出:

代码语言:javascript
复制
0, NSTaggedPointerString, 0x3015

发现这个字符串类型是 NSTaggedPointerString,那我们来看看 Tagged Pointer 是什么?

Tagged Pointer

Tagged Pointer 详细的内容可以看这里 深入理解Tagged Pointer

Tagged Pointer 是一个能够提升性能、节省内存的有趣的技术。

  • Tagged Pointer 专门用来存储小的对象,例如 NSNumberNSDate(后来可以存储小字符串)
  • Tagged Pointer 指针的值不再是地址了,而是真正的值。所以,实际上它不再是一个对象了,它只是一个披着对象皮的普通变量而已。
  • 它的内存并不存储在堆中,也不需要 malloc 和 free,所以拥有极快的读取和创建速度。

参考:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-12-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 正文
    • 但是
      • Tagged Pointer
        • 参考:
        相关产品与服务
        对象存储
        对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档