菜鸟教程小白 发表于 2022-12-13 16:11:33

iphone - 为什么使用 __weak 不会导致局部变量立即为零?


                                            <p><p>我从事同一个项目已经有一段时间了,随着时间的推移,我对 Objective-C 和 Cocoa 的理解有了一些进步。回顾我的代码的某些部分,我看到了:</p>

<pre><code>__weak ASIFormDataRequest *serverQueueRequest = ;
[serverQueueRequest setCompletionBlock:^{
    NSLog(@&#34;%@&#34;, serverQueueRequest.responseString);
}];
;
</code></pre>

<p>这就是我处理所有服务器请求的方式。我想我这样做是为了抑制警告,即“在 block 中捕获请求可能会导致保留周期”。所以我把它变弱了,这似乎解决了我所有的问题。我没有注意到这有什么真正的问题。</p>

<p>但是,现在查看代码,它的工作原理似乎有点奇怪。当我将请求声明为 <code>__weak</code> 时,它不应该立即归零,因为没有人坚持它吗?为什么这段代码有效?</p>

<p>另外,虽然这段代码有效,但我最近发现了一个不起作用的情况:当连续多次调用包含此代码的方法时,比如在一秒钟内调用 5 次,3/5 的请求将有一个 <code>NULL</code> 响应。情况一贯如此。删除 <code>__weak</code> 限定符可解决此问题。对此有何解释?</p>

<p>最后,像这样声明本地请求的正确方法是什么?</p>

<p><strong>更新</strong>:根据<a href="https://stackoverflow.com/questions/7205128/fix-warning-capturing-an-object-strongly-in-this-block-is-likely-to-lead-to-a" rel="noreferrer noopener nofollow">this question</a> ,正确的做法是这样的:</p>

<pre><code>ASIHTTPRequest *_request = [ initWithURL:...
__weak ASIHTTPRequest *request = _request;
</code></pre>

<p>编辑:实际上上面的修复并没有解决调用代码 5 次导致 NULL 响应的问题。那个问题依然存在。解决问题的唯一方法是强烈捕获请求而不使用任何限定符。</p>

<p>现在的问题是为什么我的原始代码仍然有效..</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>引自 <a href="http://developer.apple.com/library/mac/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html" rel="noreferrer noopener nofollow">Apple&#39;s Programming with ARC</a>发行说明:</p>

<blockquote>
<p>Take care when using __weak variables on the stack. Consider the
following example: </p>
</blockquote>

<pre><code>NSString __weak *string = [ initWithFormat:@&#34;First Name: %@&#34;, ];
NSLog(@&#34;string:%@&#34;, string);
</code></pre>

<blockquote>
<p>Although string is used after the initial assignment,
there is no other strong reference to the string object at the time of
assignment; it is therefore immediately deallocated. The log statement
shows that string has a null value.</p>
</blockquote></p>
                                   
                                                <p style="font-size: 20px;">关于iphone - 为什么使用 __weak 不会导致局部变量立即为零?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/12289624/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/12289624/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: iphone - 为什么使用 __weak 不会导致局部变量立即为零?