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

标签 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 是一个包含将添加多少个对象的数字;该值始终正确)

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/

相关文章:

ios - 有效地搜索集合中的 NSString

objective-c - 触摸 ImageView 到另一个 ViewController

c - 使用 Kaa C SDK 的 Kaa 应用程序调试器工具

c - usleep() 计算耗时表现得很奇怪

c - Windows 命名管道客户端上的 uv_start_read 等待服务器关闭其管道并导致 EOF

ios - 如何获取 uibutton(UITableViewCell 的 subview )相对于整个窗口 iOS objective-C 的位置?

Objective-C header 解析

java - for 循环错误

javascript - 代码错误 - 分割字符串并返回每个单词的长度 JS

javascript - 如何将对象(及其属性/值)打印到 DOM