我们可以通过在 LLVM 中 po 一下对象的 _ivarDescription 来观察__NSCFString 的继承信息 可以看到 __NSCFString 确实是继承于 NSString ,属于...[a _shortMethodDescription] : in __NSCFString: Class Methods: + (id)...__NSCFString 尝试给自己添加一个 stringByAppendingString:的安全实现(记为IMP C),由于__NSCFString 本身没有这个实现,所以方法添加成功。...至此, __NSCFString 完成了自己的MethodSwizzle。...所以当用户调用到 __NSCFString 的 stringByAppendingString 方法时,调用链路变成了: __NSCFString -> stringByAppendingString
当 NSString 的其中一个私有子类实现即为 NSCFString,其内存的结构与 CFString 是相同的,CFString 的 isa 指针就指向 NSCFString 类,即,CFString...对象就是一个 NSCFString 类的实例。...所以,当 NSString 的实现刚好是 NSCFString 的时候,他们两者之间的转换是相当容易而直接的,他们就是同一个类的实例。...当 NSString 的实现不是 NSCFString 的时候(比如我们自己 subclass 了 NSString),我们调用 CF 函数,就需要先检查对象的具体实现。...例如 CFStringGetLength 函数,当收到一个作为参数传递进来的对象时,会先确认该对象到底是不是 NSCFString 实现。
0x7fa65b800038] ################ POOL 0x7fa65b800038 objc[24294]: [0x7fa65b800040] 0x7fa65a702820 __NSCFString...############## POOL 0x7fa65b800048 ........ // objc[24294]: [0x7fa65b010958] 0x7fa65a50fdc0 __NSCFString...(3)__NSCFString 对象被存储在堆上。 __NSCFString 对象是在运行时创建的一种 NSString 子类,他并不是一种字符串常量。
, 1 */ 从打印结果来看,有三种NSString类型: 类型 描述 __NSCFConstantString 常量字符串,存储在字符串常量区,继承于 __NSCFString。...__NSCFString 存储在堆区,需要维护其引用计数,继承于 NSMutableString。2....string3 __NSCFString 通过stringWithFormat:方法创建,指针不足够存储字符串的值。...分别打印两段代码的self.name类型看看,原来第一段代码中self.name为__NSCFString类型,而第二段代码中为NSTaggedPointerString类型。...我们来看一下第一段代码Crash的地方: [820glyqsjp.png] 想必你已经猜到了,__NSCFString存储在堆上,它是个正常对象,需要维护引用计数的。
", str2, [str2 class]); // 0xa000000000000301 NSTaggedPointerString (值直接存储在指针上) // 0x600003d3c620 __NSCFString...; i++) { dispatch_async(queue, ^{ self.name = [NSString stringWithFormat:@"abcdefghij"]; // __NSCFString
NSString的内存三种不同类型的 string__NSCFConstantStringNSTaggedPointerString__NSCFString生成一个NSString类型的字符串有三种方法
Dictionary //__NSCFString
Intance_class == __NSCFString selector:encodeWithOSLogCoder:options:maxLength:, result:0 Intance_class...== __NSCFString selector:encodeWithOSLogCoder:options:maxLength:, result:0 Intance_class == NSTaggedPointerString...selector:_copyFormattingDescription:, result:0 Intance_class == __NSCFString selector:_dynamicContextEvaluation...:patternString:, result:0 Intance_class == __NSCFString selector:encodeWithOSLogCoder:options:maxLength
可以看到,真实的对象是NSString的子类__NSCFString进行实例化的。
NSString *ivarType; if ([obj isKindOfClass:NSClassFromString(@"__NSCFString
[[first shouldNot] beNil]; [[NSStringFromClass([first class]) should] equal:@"__NSCFString
Debugging 可以看到类似如下的输出: (__NSCFString *) $3 = 0x0000618000644080 @"Yay! Debugging!"
领取专属 10元无门槛券
手把手带您无忧上云