gpt4 book ai didi

Objective-C ARC 和传递 C 对象数组

转载 作者:可可西里 更新时间:2023-11-01 03:09:39 25 4
gpt4 key购买 nike

如果这是一个 C 菜鸟问题,我很抱歉:我知道我需要认真思考我的建议。不幸的是,我在截止日期前,所以没有时间完成整本书的章节,所以我希望能得到一些更有针对性的建议。

我想在 C 数组中存储一些 Objective-C 对象。我正在使用 ARC。如果我在 Mac 上,我可以改用 NSPointerArray,但我在 iOS 上,这不可用。

我将存储一个三维 C 数组:从概念上讲,我的维度是天、高度和 cacheNumber。每个元素要么是指向 Objective-C 对象的指针,要么是 NULL。

缓存的数量(即cacheNumber维度的大小)在编译时是已知的,但其他两个是未知的。此外,数组可能非常大,因此我需要为其动态分配内存。

关于所有权语义,我需要对对象的强引用。

我希望整个三维数组成为 Objective-C 对象的实例变量。

我计划有一个方法是 - tableForCacheNumber:(int)num days:(int*)days height:(int*)height。该方法应返回一个二维数组,即一个特定的缓存编号。 (它还通过引用传回它返回的数组的大小。)

我的问题:

  • 我应该按什么顺序放置维度,以便我可以轻松地返回指向某个特定缓存编号的子数组的指针? (我觉得应该是第一,但我不是100%。)

  • 我的方法的返回类型应该是什么,这样 ARC 才不会报错?我不介意返回的数组是否增加了引用计数,只要我知道它在做什么即可。

  • 保存三维数组的实例变量应该是什么类型?我认为它应该只是一个指针,因为那个 ivar 只是代表指向我数组中第一个项目的指针。正确的?如果是这样,我该如何指定?

  • 当我创建三维数组(用于我的 ivar)时,我想我做了类似 calloc(X * Y * Z, sizeof(id)) 的操作,然后将结果到我的 ivar 的类型?

  • 当从 ivar 中的三维数组访问项目时,我相信我每次都必须取消引用指针,像 (*myArray)[4][7][2]。正确吗?

  • 我从方法返回的二维数组会被类似访问吗?

  • 是否需要用objc_returns_inner_pointer标记返回的二维数组?

再次抱歉,这是一个有点糟糕的 Stack Overflow 问题(它太长且包含太多部分)。希望SO市民们见谅。为了改善我的网络业力,也许我会在这个项目发布后将其写成博客文章。

最佳答案

首先:虽然您没有 NSPointerArray,但您 CFMutableArrayRef 并且您可以传递任何您想要保留的回调/发布/描述,包括 NULL。首先尝试可能更容易(并且性能是您可以稍后衡量的)。

整理你的观点:

  • 您应该按照预期将尺寸定义为 [cacheNumber][days][height]。那么cache[cacheNumber]就是一个id *[][]类型的二维数组。正如您所说的性能很重要,请注意迭代此野兽的最快方法是:

    for (/* cacheNumber loop */) {
    for (/* days loop */) {
    for (/* height loop */) {
    //...
    }
    }
    }
  • 它应该是类型__strong id ***:那是一个指向指向id的指针的指针,这与array of ((指向 id 的指针)的数组)。

  • 您的 ivar 需要是 __strong id **** (!),因为它是上述内容的数组。
  • 关于分配数组,您猜错了。如果您使用的是多维数组,则需要这样做(为简洁起见,省略了一维):

    - (__strong id * * *)someArray {
    __strong id * * *cache = (__strong id * * *)malloc(x*y*sizeof(void *));
    id hello = @"Hello";

    cache[0] = (__strong id * *)malloc(sizeof(void *)); //same for cache[1..x-1]
    cache[0][0] = &hello; // for all cache[x][y]

    return (__strong id * * *)cache;
    }
  • 正确,这就是您使用此类指针的方式。

  • 是的,二维数组以相同的方式工作,没有第一维。
  • 我不这么认为,你正在分发 __strong 对象指针,所以你应该很了不起。也就是说,我们现在已经达到了我在这方面的能力极限,所以我很可能是错的。

关于Objective-C ARC 和传递 C 对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9869883/

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