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

ios - 为什么通过引用传递时指针值会改变?


                                            <p><p>为什么下面的 NSLog 结果不一样? </p>

<pre><code>UIView *view = ;
NSLog(@&#34;%p&#34;,&amp;view); //0x7fff59c86848
;

-(void)test:(UIView **)view{
   NSLog(@&#34;%p&#34;,view); // 0x7fff59c86840
}
</code></pre>

<p>虽然以下 NSLog 结果相同?</p>

<pre><code> NSInteger j = 1;
NSLog(@&#34;%p&#34;, &amp;j);//0x7fff5edc7ff8
;

- (void)test1:(NSInteger *)j{
   NSLog(@&#34;%p&#34;, j);//0x7fff5edc7ff8
}
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>好问题,答案不明显。</p>

<p>这完全与与变量相关的<em>所有权限定符</em>有关。当你声明:</p>

<pre><code>NSView *view;
</code></pre>

<p>这是以下的简写:</p>

<pre><code>NSView __strong * view;
</code></pre>

<p>即引用由变量 <code>view</code> 强烈持有。</p>

<p>但是当你声明时:</p>

<pre><code>-(void)test:(UIView **)view
</code></pre>

<p>这是以下的简写:</p>

<pre><code>-(void)test:(UIView * __autoreleasing *)view
</code></pre>

<p>这里 <code>view</code> 是指向变量的类型指针 __autoreleasing 指向 <code>UIView</code> 的指针。</p>

<p><code>__strong</code> 与 <code>__autoreleasing</code> 之间存在差异的原因在于 Apple 术语的 call-by-writeback 并在 <a href="https://developer.apple.com/library/content/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html" rel="noreferrer noopener nofollow"><em>Variable Qualifiers</em> in Apple&#39;s &#34;Transitioning to ARC Release Notes&#34;</a> 中进行了解释。在 <a href="http://clang.llvm.org/docs/AutomaticReferenceCounting.html" rel="noreferrer noopener nofollow"><em>Ownership qualification</em> in <em>CLANG Documentation: Automatic Reference Counting</em></a> .还解释了 SO 问题 <a href="https://stackoverflow.com/questions/8814718/handling-pointer-to-pointer-ownership-issues-in-arc" rel="noreferrer noopener nofollow">Handling Pointer-to-Pointer Ownership Issues in ARC</a>和 <a href="https://stackoverflow.com/questions/13587742/nserror-and-autoreleasing" rel="noreferrer noopener nofollow">NSError and __autoreleasing</a> .</p>

<p>简而言之:指向 <code>__strong</code> 变量的指针不能作为指向 <code>__autoreleasing</code> 变量的指针传递。为了支持你这样做,编译器引入了一个隐藏的临时变量并传递它的地址。 IE。您的代码被有效地编译为:</p>

<pre><code>UIView *view = ;
NSLog(@&#34;%p&#34;,&amp;view);
UIView __autoreleasing * compilerTemp = view;
;
view = compilerTemp;
</code></pre>

<p>因此您看到的地址不同。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 为什么通过引用传递时指针值会改变?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/41033513/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/41033513/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 为什么通过引用传递时指针值会改变?