gpt4 book ai didi

objective-c - C 一般保护错误试图访问数组中的对象

转载 作者:太空宇宙 更新时间:2023-11-04 02:51:30 24 4
gpt4 key购买 nike

在我的程序中,我将 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com