gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:06:02 25 4
gpt4 key购买 nike

我正在玩弄 NSOperationQueue为了在后台运行一些代码并让它更新 UILabel .这是 viewDidLoad .

- (void)viewDidLoad
{
[super viewDidLoad];

queue = [[NSOperationQueue alloc] init];

NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(counterTask) object:nil];
[queue addOperation:operation];
}

下面是调用操作的方法:

- (void)counterTask {
for (int i=0; i<5000000; i++) {
if (i % 100 == 0) {
[self.firstLabel performSelectorOnMainThread:@selector(setText:)
withObject:[NSString stringWithFormat:@"%d", i]
waitUntilDone:YES];
}
}

[self.firstLabel performSelectorOnMainThread:@selector(setText:) withObject:@"finished." waitUntilDone:NO];
}

随着循环往上数,越来越多@"%d" NSString s创建了,内存占用自然就上去了。然而,一旦循环完成,内存似乎并没有解除分配。我预计内存会下降为 setText:消息使用 NSString 的新实例并释放旧的。

如果我将循环条件更改为 i<5000000*2 ,到最后内存使用量大约翻了一番——所以肯定是每次迭代中发生的事情导致了泄漏。

为什么内存泄漏在这里?

编辑:忘记提及我正在使用 ARC。

最佳答案

ARC 不会移除 retain/release/autorelease,它只是控制这些方法的调用。您可以将自己的自动释放池添加到您的循环中以强制执行清理:

for (int i=0; i<5000000; i++) {
if (i % 100 == 0) {
@autoreleasepool {
[self.firstLabel performSelectorOnMainThread:@selector(setText:)
withObject:[NSString stringWithFormat:@"%d", i]
waitUntilDone:YES];
}
}
}

关于ios - 在循环中重复分配 NSString,同时避免内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23337194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com