菜鸟教程小白 发表于 2022-12-12 22:29:49

ios - Objective-C:与存储的对象的实例变量对应的指针在哪里


                                            <p><p>假设我有以下类定义</p>

<pre><code>@interface ClassX: NSObject
@property NSArray *arr;
@end
</code></pre>

<p>假设我在方法中有以下几行</p>

<pre><code>-(void)someMethod
{
ClassX *obj = ;
obj.arr = , , nil]; //Edit to avoid getting derailed by differences due to @ notation
}
</code></pre>

<p>栈里有什么,堆里有什么?</p>

<p>堆栈:</p>

<p>obj 在堆栈中。该变量的值是 obj 所在的堆中位置的地址。 </p>

<p>堆:</p>

<p>ClassX 类型的对象</p>

<p>NSArray 中的 NSArray 和 NSNUmbers 呢?他们也像上面那样划分吗?即指向 NSArray 的指针在堆栈中,而 NSArray 对象在堆中?如果是,包含“obj”对象的堆内存中包含什么?</p>

<p>我看到的数字是堆中的这 block 内存包含一个<code>isa</code>指针,然后是实例变量。 <code>isa</code> 指针指向<code>Class 结构</code> 的位置。即这 block 内存包含另一个 isa 指针,后跟 <code>Method structs</code>。每个结构都有一个 <code>selector</code> 和一个 <code>pointer</code> 指向相应实现的开始位置。</p>

<p>这似乎表明对象内的区域变量在堆中。即指向 NSArray 对象的指针在堆中。</p>

<p><strong>编辑</strong>
根据下面的答案,这是对堆和堆栈中的内容的正确看法吗?</p>

<p>堆栈将包含 4 个指针,一个指向 obj,一个指向 NSArray,两个指向 NSNumber 对象。 </p>

<p>从<code>obj</code>指向的地址开始的堆内存有
1.<code>isapointer</code>指向ClassX类结构
2.后跟内存存放NSArray对象。 </p>

<p>这个 NSArray 对象内存有
1. isapointer指向NSArray类结构
2.后跟内存存放2个NSNumber对象。 </p>

<p>NSNUmber 对象内存包含
1.一个指向NSNumber类结构的isapointer
2.后跟内存存储2个int </p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p><code>NSArray</code> 和 <code>NSNumber</code> 对象都是堆分配的,而不是堆栈分配的。</p>

<p>它们看起来不像堆对象,因为编译器使用相对较新的语法 <code>@[]</code> 隐藏了它。</p>

<p>当你写作时</p>

<pre><code>@[@1, @2]
</code></pre>

<p>编译器将其翻译成</p>

<pre><code>, } count: 2]
</code></pre>

<p>最终结果如下:栈中有一个指向<code>ClassX</code>类型对象的指针。此指针指向的内存以 isapointer 开头,后跟指向堆中具有 <code>NSArarray</code> 对象的另一个位置的指针。反过来,这部分堆内存有另一个 isapointer 后跟一个指向表示 <code>NSArray</code> 内部数组的内存块的指针,其中包含两个指向 <code>NSNumber</code> 对象的指针。每个 <code>NSNumber</code> 对象都有一个 isapointer 后跟代表数字的数据。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - Objective-C:与存储的对象的实例变量对应的指针在哪里,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/39938182/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/39938182/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - Objective-C:与存储的对象的实例变量对应的指针在哪里