【问题标题】:Why is the memory allocated from componentsSeparatedByString never being allocated为什么从 componentsSeparatedByString 分配的内存永远不会被分配
【发布时间】:2015-03-13 17:01:13
【问题描述】:

我有一个 iOS 应用程序,它进行大量计算并使用标准 ARC 进行内存管理。在我运行它几分钟后,它由于内存不足而崩溃。我检查了 Instruments,大部分内存都被调用 NSString 的 cmetsSeparatedByString 的分配占用了。

我尝试在自动释放池中运行它,但这并没有太大帮助。由于在我的函数之外没有对该字符串的引用,我很困惑为什么没有自动释放内存。我还有另一个与 cmetsSeparatedByString 有相同问题的函数。

代码如下:

- (void) processWorkWithExtraData:(NSData *) extraData
{
@autoreleasepool {

    NSString *string = [[NSString alloc] initWithData:extraData encoding:NSUTF8StringEncoding];

    NSArray *dataArray = [string componentsSeparatedByString:@","]; // eats up memory like crazy!!!

    NSMutableArray *objectArray = [[NSMutableArray alloc] init];

    for (int i=0;i<[dataArray count];i += 1)
    {
        TestObject *p = [[TestObject alloc] initWithFloat:[[dataArray objectAtIndex:i] floatValue]]; 

        [objectArray addObject:p];

    }

    [self processArray: objectArray]; // just performs math computations on the floats in the objects

}
}

如果有人可以让我知道为什么这里不会释放内存,请告诉我。

【问题讨论】:

    标签: ios objective-c memory-management automatic-ref-counting


    【解决方案1】:

    解决了问题,我以为我在使用 ARC 但我没有(:

    好消息是这解决了我的记忆问题。

    不好的是它要慢得多(慢 50-70%)。

    我想这就是人们必须为 ARC 的魔力付出的代价。

    【讨论】:

    • ARC 不应该更慢。它的工作与手动引用计数相同,只是编译器会为您处理。事实上,ARC 通常稍微快一些,因为 LLVM 编译器能够删除不需要的保留/释放/自动释放调用。如果我是你,我会通过 Instruments 中的时间分析器运行它,看看我是否能弄清楚是什么花了这么长时间。
    • 从字面上看,我唯一更改的是 ARC 设置,因此显然有一些直接影响。该程序涉及基于数学的模拟,因此它应该是“慢”的,尽管可能是我的对象管理代码不是最佳的(我有数千个小对象),这可能是 ARC 具有如此大影响的原因。
    • 如果您说的是真的,您应该将错误发布到 Apple 的错误报告服务并使用您的应用作为示例。 ARC 不应该更慢。通过 Instruments 性能分析器运行非 ARC 和 ARC 版本并查看额外时间来自何处是值得的。关于我能想到的唯一一件事是自动释放池的不同处理导致您的应用程序内存不足并产生“流失”,但这似乎不太可能。低内存流失和崩溃之间的界限很窄。
    • iOS 没有像 Unix 正常那样的分页虚拟内存,所以应用程序不应该是 "thrashing"
    猜你喜欢
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    • 2021-02-11
    • 2020-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    相关资源
    最近更新 更多