NSString的三种类型

2023-03-23  本文已影响0人  星星326

参考博客

iOS - 老生常谈内存管理(五):Tagged Pointer

NSString的内存管理

iOS里的TaggedPointer[NSString篇]

问题发现:

    NSString *firstString = @"helloworld";
    NSString *secondString = [NSString stringWithFormat:@"helloworld"];
    NSString *thirdString = @"hello";
    NSString *fourthSting = [NSString stringWithFormat:@"hello"];
    NSLog(@"%p %@\n%p %@\n%p %@\n%p %@\n",firstString,[firstString class],secondString,[secondString class],thirdString,[thirdString class],fourthSting,[fourthSting class]);

创建四个字符串 一、三直接赋值,二、四通过stringWithFormat进行赋值 一、二赋值helloworld 三、四赋值hello(长度比上面的短)
看一下结果


一、三直接赋值不管长短,类型相同,地址相邻,都为__NSCFConstantString类型 二为__NSCFString类型,四为NSTaggedPointerString类型 来了解一下NSString的这三种类型

__NSCFConstantString

Constant->常量

__NSCFString

NSTaggedPointerString


标签指针的概念

理解这个类型,需要明白什么是标签指针,这是苹果在 64 位环境下对 NSString,NSNumber 等对象做的一些优化。

简单来讲可以理解为把指针指向的内容直接放在了指针变量的内存地址中,因为在 64 位环境下指针变量的大小达到了 8 字节足以容纳一些长度较小的内容。于是使用了标签指针这种方式来优化数据的存储方式。


NSString的深浅复制问题

想看看__NSCFString和NSTaggedPointerString的copy和mutableCopy的结果是否一致


__NSCFString的字符串和我们之前理解的一样


NSTaggedPointerString也一样


常量字符串也和我们之前的理解一样 结束。

上一篇下一篇

猜你喜欢

热点阅读