iOS stringWithUTF8String(真的CFAllocatorAllocate)EXC_BAD_ACCESS崩溃,在ARC下

时间:2013-03-14 11:23:05

标签: ios nsstring exc-bad-access

我有一些看似安全的代码,但我得到了EXC_BAD_ACCESS。不经常介意,只有这一次。

代码:

- (void) deviceListenerCallback:(DeviceEventTypeDef)type data:(void*)data
{
    DeviceInfoDef* o = (DeviceInfoDef*)data;
    char newName[256];
    if (o->DeviceName) {
        strncpy(newName, o->DeviceName, 255);
    } else {
        strncpy(newName, "(null)", 255);
    }
    NSString *deviceNameUTF8 = [NSString stringWithUTF8String:(const char *)newName];

'data'是从C库传递给我们的指针。数据存在且没有损坏。

从strncpy以newName结尾的字符是“Network Audio \ 0 \ 0 \ 0 \ 0 \ 0 ...”

当我调用stringWithUTF8String时,EXC_BAD_ACCESS位于最后一行。错误是:

EXC_BAD_ACCESS (code=1, address=0x30303030)

调用堆栈是:

CFAllocatorAllocate
................................
5 +[NSString stringWithUTF8String:]
6 -[MyClass deviceListenerCall...

该项目在ARC下运行。

有人能指出我必须做错的新手吗?

谢谢,

-Ken

2 个答案:

答案 0 :(得分:0)

我不清楚为什么你使用strncpy(),因为输入字符串包含终止NUL - 字符。

为什么不直接从deviceNameUTF8创建o->DeviceName(错误名称,而不是UTF-8)?

- (void) deviceListenerCallback:(DeviceEventTypeDef)type data:(void*)data
{
    DeviceInfoDef* o = (DeviceInfoDef*)data;
    NSString *deviceName;
    if (o != NULL)
        deviceName = [NSString stringWithUTF8String:o->DeviceName];
    else
        deviceName = @"";

答案 1 :(得分:0)

NSString *deviceNameUTF8 = [NSString stringWithUTF8String: [[NSString alloc] initWithBytes:newName length:255 encoding: NSUTF8StringEncoding]];

我认为这应该可以解决问题。