gpt4 book ai didi

ios - dispatch_async,执行后内存不释放

转载 作者:行者123 更新时间:2023-11-29 02:29:34 26 4
gpt4 key购买 nike

我有一个使用dispatch_async的函数:

- (IBAction)action:(id)sender {
int i=10000;
NSString * data;
dispatch_queue_t queue = dispatch_queue_create("com.wang.queue", NULL);
__weak ViewController* weakSelf = self;
while(i>0)
{
@autoreleasepool {
data = [[NSString alloc]initWithFormat:@"%i",i];
NSString * str = data;
dispatch_async(queue, ^{{
[weakSelf print:str];
}});
i--;
}
}
}


-(void) print:(NSString*)str
{
NSLog(@"%@",str);
str = nil;
}

然后我连续按下按钮五次。完全运行后,内存并没有减少。所以我用Instrument来分析内存被占用的地方。像这样:

img.bbs.csdn.net/upload/201411/19/1416403576_473540.png

显示“data”的内存被释放了。占用内存的是“VM:性能工具数据”。详情是:

img.bbs.csdn.net/upload/201411/19/1416403630_487530.png

我认为有关“dispatch_async”的某些内容从未被释放。

谁能告诉我是什么让内存表现得这样?欣赏!

最佳答案

一些想法:

  1. 您正在使用 NSString 对象,但是 NSString 的各种缓存/优化可能会扭曲这种分析。通常,您应该警惕使用 NSString 对象进行内存分析。您可能想使用 NSObject 或某些自定义类重复此操作。我不认为这是这里的问题,但在调试内存分配时始终要注意这一点。

  2. 您正在使用@autoreleasepool,但没有自动释放对象。我假设您只是为了谨慎而放入该池,但是您的主要 data/str 对象并未自动释放,因此该池可能不会为您购买任何东西。另外,仅供引用,无论如何,GCD 使用自己的自动释放池。

  3. 即使您确实有 autorelease 对象,data 变量也是在您的 @autoreleasepool 范围之外定义的,并且您永远不会消除池内的最终强引用,因此池不会完成任何事情。您应该为变量使用尽可能窄的范围。在这种情况下,我只需停用 data 变量并仅使用本地 str 变量。

  4. 有人建议您可能有一个保留周期(也称为强引用周期)。不存在这样的循环,至少在迄今为止与我们共享的代码中没有。

  5. 话虽如此,在我看来,“性能工具数据”似乎与您正在创建的 10,000 个对象无关。您有 347 个对象,占 180 mb。

    我想知道这个“性能数据”是否是 Instruments 本身正在创建的东西(例如快照、堆栈跟踪等)。我做了一些实验,但无法重现您描述的行为。我尝试更改 Xcode 方案以打开一堆日志记录选项(例如僵尸、内存检查、日志记录等),并且我尝试更改 Instruments 以记录最大数量的信息(例如频繁快照等,保持丢弃项、记录引用计数等)。这一切都无济于事。

    或许您可以分享您可能已打开的 Instruments 设置(或尝试关闭一些)。同样与您的应用程序的方案(确保您已关闭不必要的日志记录)。此外,请编辑您的问题,向我们提供有关您使用的 Xcode/Instruments 版本以及目标操作系统版本等的详细信息。

关于ios - dispatch_async,执行后内存不释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27078350/

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