首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将ObjectiveC对象与malloc一起使用

将ObjectiveC对象与malloc一起使用
EN

Stack Overflow用户
提问于 2015-09-14 17:07:27
回答 2查看 252关注 0票数 0

我尝试创建双指针来模拟保存ObjectiveC对象的二维数组

下面是我的声明语法: BlockInfo.m

代码语言:javascript
复制
@implement BlockInfo
-(void)someMethod{
}
@end

Other.m文件

代码语言:javascript
复制
BlockInfo** pt = (BlockInfo**)malloc(sizeof(BlockInfo*)*10);

for(int i=0; i<10; i++){
        pt[i] = (BlockInfo*)malloc(sizeof(BlockInfo)*3);
}

以下是错误:

指向没有显式所有权的非常数类型“BlockInfo*”的指针

在体系结构和平台上不支持将“sizeof”应用于接口“BlockInfo*”

任何帮助都将不胜感激!

EN

回答 2

Stack Overflow用户

发布于 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不允许复制整个数组(就像结构一样),所以您必须分配每个引用,就像您在代码中所做的那样。

但有一些需要注意的地方:

当阵列失去其范围时,

  • ARC无法真正跟踪实例的所有权。因此,在数组的范围丢失之前,将每个元素显式设置为nil
  • 不使用memcpy()或类似的函数来更改元素的值。ARC没有机会释放之前存储的引用,也没有机会保留新存储的instance.
  • When。如果将新引用分配给一个元素,则释放旧引用。因此,在开始时,必须用nil填充整个数组。(对于局部变量,这是自动完成的。这就是为什么强局部变量被初始化的原因。)对于you.
  • Typically,calloc()会自动这样做,元素应该是强引用。您必须显式指定此选项。

顺便说一句:你可以使用id*类型的C数组,因为所有的对象引用都有相同的大小。(显然,也必须这样做)。You shouldn't cast a malloc()'s return value.

所以像这样的东西应该是有效的:

代码语言:javascript
复制
__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;
}
票数 2
EN

Stack Overflow用户

发布于 2015-09-14 17:16:21

您似乎尝试在启用ARC的情况下进行编译。尝试将-fno-objc-arc作为编译器参数传递。

有关更多详细信息,请阅读Objective-C Runtime ReferenceObjective-C Runtime source code

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32560998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档