我正在使用高级Cocoa功能(如NSString
和NSData
进行一些字符串操作,而不是像C类数据一样处理C级事务。 {1}}秒。
为了热爱它,char
有时会在+[NSString stringWithUTF8String:]
创建的完美字符串上返回nil
。可以假设当输入格式错误时会发生这种情况。以下是十六进制输入失败的示例:
-[NSString UTF8String]
和ASCII:
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
这是一个随机生成的字符串,用于测试我的子例程。
UkfQ5YJ\j`@3_EX`G?n^`Y4XhAKaN?AF
编辑:以防万一有人没有理解隐含的问题,这里是-v模式:
为什么[NSString stringWithUTF8String:]有时会在完美形成的UTF8-String上返回char * buffer = [randomNSString UTF8String];
// .... doing things .... in the end, buffer is the same as before
NSString * result = [NSString stringWithUTF8String:buffer];
// yields nil
?
答案 0 :(得分:2)
walkytalky是对的。以这种方式,9d在utf8中是不合法的。具有顶部位10的utf8字节被保留为连续字符,它们从不出现没有带有多个前导位的前缀字符。
答案 1 :(得分:0)
这在黑暗中有点刺痛,因为我们没有足够的信息来正确诊断问题。
如果randomNSString
在为result
分配内存时不再存在,例如,如果它已在引用计数环境中释放或在GC环境中收集,则可能buffer
指向已被释放但尚未重用的内存(这可以解释为什么它仍然是相同的)。
但是,创建一个新的NSString需要分配内存,它可能会使用缓冲区指向的块,这意味着你的UTF8字符串会被新的NSString的内部触发。您可以通过在无法创建result
之后登录缓冲区的内容来测试此理论。不要使用%s
说明符,打印十六进制字节。