菜鸟教程小白 发表于 2022-12-12 09:34:05

ios - 在循环中重复分配 NSString,同时避免内存泄漏


                                            <p><p>我正在玩弄 <code>NSOperationQueue</code> 以便在后台运行一些代码并让它更新 <code>UILabel</code>。这是 <code>viewDidLoad</code>。</p>

<pre><code>- (void)viewDidLoad
{
;

queue = [ init];

NSInvocationOperation *operation = [ initWithTarget:self selector:@selector(counterTask) object:nil];
;
}
</code></pre>

<p>下面是调用操作的方法:</p>

<pre><code>- (void)counterTask {
for (int i=0; i&lt;5000000; i++) {
    if (i % 100 == 0) {
      [self.firstLabel performSelectorOnMainThread:@selector(setText:)
                     withObject:
                     waitUntilDone:YES];
    }
}

;
}
</code></pre>

<p>随着循环计数的增加,越来越多的 <code>@"%d"</code> <code>NSString</code> 被创建,内存使用自然会增加。然而,一旦循环完成,内存似乎并没有释放。我预计内存会下降,因为 <code>setText:</code> 消息使用 <code>NSString</code> 的新实例并释放旧实例。</p>

<p>如果我将循环条件更改为 <code>i<5000000*2</code>,到最后内存使用量大约会增加一倍 - 所以肯定是每次迭代都会发生一些事情导致泄漏。</p>

<p>为什么这里有内存泄漏?</p>

<p>编辑:忘了提到我正在使用 ARC。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>ARC 不会删除 retain/release/<em>autorelease</em>,它只是控制这些方法的调用。您可以将自己的自动释放池添加到循环中以强制清理:</p>

<pre><code>for (int i=0; i&lt;5000000; i++) {
    if (i % 100 == 0) {
      @autoreleasepool {
            [self.firstLabel performSelectorOnMainThread:@selector(setText:)
                                              withObject:
                                           waitUntilDone:YES];
      }
    }
}
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 在循环中重复分配 NSString,同时避免内存泄漏,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/23337194/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/23337194/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 在循环中重复分配 NSString,同时避免内存泄漏