0

我有一个iOS应用程序,它做了很多计算,并且使用标准ARC进行内存管理。运行它几分钟后,由于内存不足而崩溃。我用Instruments进行了检查,大部分内存正在通过调用NSString的commentsSeparatedByString来分配。为什么从componentsSeparatedByString分配的内存永远不会被分配

我试着在autorelease池中运行它,但没有多大帮助。由于在我的函数之外没有对该字符串的引用,所以我很困惑为什么内存不会被自动释放。我还有另一个与commentsSeparatedByString具有相同问题的函数。

下面是代码:

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

} 
} 

如果任何人都可以让我知道为什么内存不会被释放在这里请让我知道。

回答

0

想通了这个问题,我还以为是使用ARC,但我不(:

好的事情是这样解决我的记忆问题

坏的事情是,它是慢得多(50-70。 %速度较慢)。

我想这是价格一个必须付出代价的是ARC的魔力。

+0

ARC不应该有任何慢。它同样的工作手动引用计数,但编译器需要照顾它实际上,由于LLVM编译器能够,ARC通常稍微快一点o删除不需要的保留/释放/自动释放呼叫。如果我是你的话,我会通过乐器中的时间分析器来运行它,看看我能不能弄清楚需要这么长时间。 – 2015-03-13 18:30:22

+0

字面上我改变的唯一事情就是ARC设置,所以这显然有一些直接的影响。该程序涉及基于数学的模拟,所以它应该是'慢',尽管它可能是我的对象管理代码不是最优的(我有成千上万的小对象),这可能是ARC产生如此巨大影响的原因。 – Locksleyu 2015-03-16 16:32:32

+0

如果你说的是真的,你应该向苹果的bug报告服务发布一个bug,并以你的应用为例。 ARC不应该慢。通过仪器性能分析器运行非ARC和ARC版本并查看额外时间来自哪里是值得的。关于我能想到的唯一事情是自动发布池的不同处理方式会导致您的应用在内存不足的情况下运行并产生“流失”,但这似乎不大可能。低内存流失和崩溃之间的界限非常薄。 – 2015-03-16 16:43:43