【问题标题】:Why iOs code is using so much memory and CPU为什么 iOs 代码使用如此多的内存和 CPU
【发布时间】:2019-05-10 08:28:00
【问题描述】:

我有一些排列/组合代码,它遍历 20 个对象,一次取 5 个。当列表满足某些标准时,我会打印构成该列表的对象。不用说循环相当大。我将所有组合放在循环内的 NSMutableArray 中。添加对象并通过/失败测试后,我会从数组中删除所有对象。 (下面的伪代码)。

-(void)CreateCombinations
{
   NSMutableArray *Combinations = [[NSMutableArray alloc] init];
   @autoreleasepool {
   NSArray *objectsList = [[NSArray alloc] initWithObjects: 
   @“Lisa”,@“Kevin”,…nil];
   } //autorelease pool

   while(!Finished)
   {
       Combinations = [self getNextCombo: Combinations]
        if (goodCombination)
           [self printCombos:Combinations]

        [Combinations removeAllObject];
   } 
}

在监视调试会话时,CPU 和内存已满负荷。我确信循环正在发挥作用。我不相信我会为每次迭代重新分配“组合”数组。如果是,我可以做些什么来确保在循环的下一次迭代之前正确地释放或释放它?

当我添加@autorelease(在循环之前)时,我得到一个“使用未声明的标识符错误”。

【问题讨论】:

  • 自动释放池怎么样?
  • 谢谢,马特。我尝试了自动释放池,但在代码的其他部分中将对象添加到数组时导致了一些额外的问题。
  • 这是我对自动释放所做的:@autorelease{ NSArray *objectsList = [[NSArray alloc] initWithObjects: @“Lisa”,@“Kevin”,...nil]; }
  • 好吧,如果你只显示伪代码,你只会得到伪建议。展示你的真实代码,展示你尝试了什么以及它导致了什么问题,并询问相关问题。自动释放池如何防止内存在循环期间堆积。
  • 在循环中放置@autoreleasepool 是没有意义的。循环是问题所在。您需要将@autoreleasepool inside 放在循环中,以便每次通过循环时都会调用它。

标签: ios xcode memory nsmutablearray cpu


【解决方案1】:

您显示的代码完全是假的,因此无法猜测您的真实代码做错了什么。但是,如果您因为在循环期间堆积自动释放的对象而使用内存,请将循环的内部包装在 @autoreleasepool 块中:

while (...) {
    @autoreleasepool {
        // do stuff
    }
}

想法是每次通过循环释放临时使用的内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-02
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多