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<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<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]