C一般保护故障尝试访问数组中的对象

时间:2014-02-09 18:12:40

标签: objective-c c arrays macos exc-bad-access

在我的程序中,我将objective-c对象存储在c数组中,就像这样

va_start(list, o);
retval->objs = malloc(SIZE * count);
retval->objs[0] = (__bridge void *)o;
for (int i = 1; i < count; i++)
{
    id o = va_arg(list, id);
    retval->objs[i] = (__bridge void *)o;
}
va_end(list);

count是一个数字,包含要添加的对象数量;该值始终是正确的)

objsvoid **,是retval的一部分,它是指向结构的指针。截至目前,SIZE被定义为100.增加和减少没有效果。

如您所见,我必须将ovoid *联系起来。 objs,当添加所有对象时,包含3个objective-c对象。当我尝试访问像这样的值时

void *obj = CLArrayObjectAtIndex(_arr, ind);
return (__bridge id)obj;

这是CLArrayObjectAtIndex()函数

void *CLArrayObjectAtIndex(CLArrayType *arr, int ind)
{
    void *o = arr->objs[ind];
    if (o)
        return o;
    else
        perror("Attempt to access NULL object or index out of bounds."), abort();
}

如果索引(ind)为0,则可以正常工作。如果索引为1,则程序在main返回时崩溃。如果索引是2,程序会在我尝试访问它时立即崩溃。如果索引为1,则上面返回的值是正确的,但是当程序在返回时崩溃时,它是nil

如果索引为1,则EXC_BAD_ACCESS代码为1;如果索引为2,则代码为EXC_I386_GPFLT,这是一个常规保护错误。我已经检查过here有关此异常的解释,但我找不到任何有用的信息。那么,是否有人知道为什么会出现这种错误?

1 个答案:

答案 0 :(得分:2)

当你在C数组中存储obj-c对象时,不仅仅是桥接它们,因为这样,arc不知道它们仍然被使用并释放它们。 __bridge_retain他们所以他们留在后面,当你释放数组__bridge_transfer他们让他们回到ARC

也不要将大小定义为100 .. sizeof(id)应该有效。您只需要存储指针