【发布时间】:2012-03-26 09:44:02
【问题描述】:
如果这是一个 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)创建 3D 数组时,我想我会执行类似
calloc(X * Y * Z, sizeof(id))的操作,并将结果转换为我的 ivar 的类型?从 ivar 中的三维数组访问项目时,我相信我每次都必须取消引用指针,例如
(*myArray)[4][7][2]。对吗?我从方法返回的二维数组会被类似访问吗?
是否需要将返回的二维数组标记为
objc_returns_inner_pointer?
再次抱歉,这是一个有点糟糕的 Stack Overflow 问题(它太长且包含太多部分)。我希望SO公民能原谅我。为了提高我的互联网业力,也许我会在这个项目发布后将它写成一篇博文。
【问题讨论】:
-
在this page 上找到了一个示例(“我可以在 ARC 下创建一个保留指针的 C 数组吗?”,靠近底部),我试图从中推断。如果有人希望发布答案,我仍然非常感谢您的澄清:)
标签: objective-c ios automatic-ref-counting