菜鸟教程小白 发表于 2022-12-13 08:04:53

ios - C 样式 2D 数组作为 ivar


                                            <p><p>在 C 中,我们可以执行以下操作来创建二维数组:</p>

<pre><code>int intArray;
</code></pre>

<p>在 C99 中,我们可以创建一个 VLA:</p>

<pre><code>size_t col = 10;
size_t row = 10;

int array;
</code></pre>

<p>在 Objective-C 的方法中,我可以创建一个包含 <code>id</code> 的二维数组,如下所示:</p>

<pre><code>id genObjectArray;
</code></pre>

<p>是否可以在 Objective-C 中创建二维数组 ivar?</p>

<p>以下是我尝试过的:</p>

<pre><code>@interface myClass ()
{
    id objArray[][];
    //This doesn&#39;t work, unless I specific size.
    //I want to do this, so that I could specific the size later during
    //runtime
}
</code></pre>

<p>在 C 中,我可以执行以下操作并稍后在 block 范围内为二维数组分配空间:</p>

<pre><code>int **array;
int *elements;
</code></pre>

<p>我也可以在 Objective-C 中做同样的事情,但是当我使用 <code>id</code> 或其他对象类型时会出现问题;换句话说,以下内容无效:</p>

<pre><code>id **array;
id *elements;
</code></pre>

<p>因此,我的问题是,是否可以将 C 样式的 2D 数组声明为包含 <code>id</code>s 的 ivar?</p>

<p>我知道我们可以使用普通的 <code>NS(Mutable)Array</code>;但这仅用于教育目的。 </p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>你不能这样做。对于 C99 VLA,数组所需的空间在数组声明时分配。对于 ivar,执行此操作的类似时间是分配和初始化对象时,但 Objective C 中不支持执行此操作。您需要对对象构造函数的功能有更严格的定义(更像 Java 的构造函数,而不是 Objective C 的初始化程序)。</p>

<p>你能得到的最接近的应该是这样的:</p>

<pre><code>@interface myClass () {
    id * objArray;
}

-(instancetype)initWithRow:(size_t)row col:(size_t)col {
    self = ;
    if (self) {
      objArray = calloc(row * col * sizeof(id));
    }
    return self;
}

-(void)dealloc {
    free(objArray);
}
</code></pre>

<p>在这种情况下,您将 ivar 声明为指针并自己管理存储(以及多维数组的步幅)。</p>

<p>显然,<code>NSArray</code> 在所有可能的方面都更好。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - C 样式 2D 数组作为 ivar,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/30836634/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/30836634/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - C 样式 2D 数组作为 ivar