这两天开发的过程中,发现了Xcode一个奇怪的问题。debug的时候,请求返回的responseObject中,一部分key显示为(no summary)。但是用po显示出来的确实正确的,好诡异。
发现简书上也有人遇到类似的问题:[iOS]解决解析json并存入字典时出现no summary的情况,但是文中并没有给出出现这个现象的原因。跟@R4L同学讨论中,他发现key的类型是taggedPointerString,随后在stackOverFlow上发现了如下的回答:
原来,在64位系统中,一些占用长度较少的NSString会被自动转换为NSTaggedPointerString。对于这种技术的实现细节可以参考这里。
简单的说,在64位系统中,一个对象指针占用了64位的整数。对于一些数据量很小的对象类型,比如NSString或者NSNumber来说,对象指针占用的内存可能比对象本身还要大,这样就非常浪费内存。苹果通过采用Tagged Pointer技术来优化这个问题。对于小数据量的对象类型,不再采用分配一段内存给对象指针,再分配一段内存给对象的做法。而是直接在原本应该存放对象指针的内存中直接存放对象。具体的实现可以研究上面提到的文章,如果英文好的童鞋也可以直接看英文原文。
最后,不得不说苹果的工程师好nb,怪不得ios那么流畅,但是iphone的内存才那么小。