我尝试创建双指针来模拟保存ObjectiveC对象的二维数组
下面是我的声明语法: BlockInfo.m
@implement BlockInfo
-(void)someMethod{
}
@endOther.m文件
BlockInfo** pt = (BlockInfo**)malloc(sizeof(BlockInfo*)*10);
for(int i=0; i<10; i++){
pt[i] = (BlockInfo*)malloc(sizeof(BlockInfo)*3);
}以下是错误:
指向没有显式所有权的非常数类型“BlockInfo*”的指针
在体系结构和平台上不支持将“sizeof”应用于接口“BlockInfo*”
任何帮助都将不胜感激!
发布于 2015-09-14 18:37:13
首先,你应该重新检查一下在C数组中是否需要id。你做到了吗?好的,再来一次。你还需要它吗?好了,继续读下去。
1.
代码中的错误之处在于,您试图使用malloc()来分配实例。永远不要那样做。使用+alloc-init,使用+new,使用方便的分配器,但始终使用框架来创建实例。除了给RTE注册实例创建的机会之外,这对您来说更容易,因为否则您必须设置实例的适当基础设施。而且没有理由通过C的malloc()来创建实例。
2.
除此之外,您还可以将实例引用(id类型的表达式)存储到C对象(“变量”)。更准确地说:您总是这样做,因为对实例的每个引用都是一个C对象(“变量”)。因此,您也可以使用C数组。
如果类型是可保留对象指针类型或元素类型为可保留对象所有者类型的数组类型,则该类型是可保留对象所有者类型。http://clang.llvm.org/docs/AutomaticReferenceCounting.html#id20
这样做的原因是C不允许复制整个数组(就像结构一样),所以您必须分配每个引用,就像您在代码中所做的那样。
但有一些需要注意的地方:
当阵列失去其范围时,
nil。memcpy()或类似的函数来更改元素的值。ARC没有机会释放之前存储的引用,也没有机会保留新存储的instance.nil填充整个数组。(对于局部变量,这是自动完成的。这就是为什么强局部变量被初始化的原因。)对于you.calloc()会自动这样做,元素应该是强引用。您必须显式指定此选项。顺便说一句:你可以使用id*类型的C数组,因为所有的对象引用都有相同的大小。(显然,也必须这样做)。You shouldn't cast a malloc()'s return value.
所以像这样的东西应该是有效的:
__strong BlockInfo** pt = calloc(10, sizeof(id));
for(int i=0; i<10; i++){
pt[i] = [BlockInfo new];
}
…
for(int i=0; i<10; i++){
pt[i] = nil;
}发布于 2015-09-14 17:16:21
您似乎尝试在启用ARC的情况下进行编译。尝试将-fno-objc-arc作为编译器参数传递。
有关更多详细信息,请阅读Objective-C Runtime Reference或Objective-C Runtime source code。
https://stackoverflow.com/questions/32560998
复制相似问题