在我的程序中,我将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
是一个数字,包含要添加的对象数量;该值始终是正确的)
objs
是void **
,是retval
的一部分,它是指向结构的指针。截至目前,SIZE
被定义为100.增加和减少没有效果。
如您所见,我必须将o
与void *
联系起来。 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有关此异常的解释,但我找不到任何有用的信息。那么,是否有人知道为什么会出现这种错误?
答案 0 :(得分:2)
当你在C数组中存储obj-c对象时,不仅仅是桥接它们,因为这样,arc不知道它们仍然被使用并释放它们。 __bridge_retain他们所以他们留在后面,当你释放数组__bridge_transfer他们让他们回到ARC
也不要将大小定义为100 .. sizeof(id)应该有效。您只需要存储指针