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