“的NSString stringWithUTF8String:”过于敏感
问题描述:
我在做使用像NSString
和NSData
高层可可的功能,而不是向下挖掘至C级之类的东西上的char
小号阵列工作的一些字符串操作的中间。“的NSString stringWithUTF8String:”过于敏感
对于它的爱,+[NSString stringWithUTF8String:]
有时返回nil
上一个完美的字符串,首先用-[NSString UTF8String]
创建。人们会认为这是在输入格式错误时发生的。下面是失败时,以十六进制输入的一个示例:
55 6B 66 51 35 59 4A 5C 6A 60 40 33 5F 45 58 60 9D 47 3F 6E 5E
60 59 34 58 68 41 4B 61 4E 3F 41 46 00
和ASCII:
UkfQ5YJ\j`@3_EX`G?n^`Y4XhAKaN?AF
这是随机生成的字符串,来测试我子程序。
char * buffer = [randomNSString UTF8String];
// .... doing things .... in the end, buffer is the same as before
NSString * result = [NSString stringWithUTF8String:buffer];
// yields nil
编辑:万一有人没掌握隐含的问题,在这里它是在-v模式:
为什么[的NSString stringWithUTF8String:]有时返回一个五脏俱全nil
UTF8-串?
答
这在黑暗中有点刺,因为我们没有足够的信息来正确诊断问题。
如果randomNSString
不再在您分配的内存result
,举例来说,如果它已经在引用计数的环境中释放或在GC环境中收集的点存在,有可能buffer
指向具有记忆被释放但尚未被重用(这可以解释为什么它仍然是一样的)。
但是,创建一个新的NSString需要分配内存,它可能会使用缓冲区指向的块,这意味着您的UTF8字符串会被新的NSString的内部消除。您可以通过在未能创建result
之后登录缓冲区的内容来测试此理论。不要使用%s
说明符,但打印十六进制字节。
答
walkytalky是对的。 9d在这种方式在utf8中不合法。 UTF8字节的前10位保留为连续字符,它们不会出现前缀字符不超过一个前导位。
在'-UTF8String'和'-stringWithUTF8String:'之间是否有任何机会autorelease池被耗尽? – 2011-06-07 09:40:16
@Bavarious:不,缓冲区在'stringWithUTF8String:'被调用的时候仍然活着。 – 2011-06-07 09:49:10
你能发布产生该缓冲区的原始UTF-8字符串吗?可能首先通过'-dataUsingEncoding:'来表示'NSData'表示,然后是'-UTF8String'之后的缓冲区。 – 2011-06-07 09:54:30