在我的程序中,我将 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有关此异常的解释,尽管我找不到任何有用的信息。那么,有人知道为什么会发生此错误吗?
最佳答案
当您将 obj-c 对象存储在 C 数组中时,不要只是桥接它们,因为那样 arc 就不知道它们仍在使用并释放它们。 __bridge_retain 它们以便稍后在您释放数组时保留它们 __bridge_transfer 它们以将它们还给 ARC
也不要将大小定义为 100.. sizeof(id) 应该可以工作。你只需要存储指针
关于objective-c - C 一般保护错误试图访问数组中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21662908/