2014-01-26 63 views
1

我有一系列的11嵌入彼此循環,個個0-5:的NSString吃內存

NSPredicate *p 
NSString *stringEquation;  

for (i=0; i<6; i++) { 

     for (j=0; j<6; j++) { 

     etc. . . . . 

     } 

    } 

最後的循環中,我有評估基於這些迴路數量的表達式迭代:

stringEquation = [NSString stringWithFormat:@"%d.0%@%d.0%@%d.0%@%d.0==24.0",[[theNumbers objectAtIndex:a] intValue],[someOperators objectAtIndex:v],[[theNumbers objectAtIndex:b] intValue],[someOperators objectAtIndex:w],[[theNumbers objectAtIndex:c] intValue],[someOperators objectAtIndex:x],[[theNumbers objectAtIndex:d] intValue]]; 

p = [NSPredicate predicateWithFormat:stringEquation]; 

if ([p evaluateWithObject:nil]) { 

    [theMatches addObject:[NSString stringWithFormat:@"%ld,%ld,%ld,%ld,%ld,%ld,%ld",(long)a,(long)b,(long)c,(long)d,(long)v,(long)w,(long)x]]; 

    fourMatches = fourMatches + 1; 

} 

NSPredicate和NSString都設置在第一個For循環之前。一切工作正常,它的所有評估正確;但是,每次迭代都會使用內存。我在這裏做錯了什麼?我雖然通過重用相同的NSPredicate和NSString變量,我會節省內存,而不是增加它的使用。

謝謝。

回答

2

由於你有很多嵌套循環,原因可能是因爲你的代碼確實可以使用大量內存:11個循環,每個完成6次,給你六個11或362797056潛在匹配的能力,所以您可以在theMatches集合中存儲儘可能多的字符串對象。

然而,更可能的原因是你有很多未決的autorelease對象。它們沒有被使用,但是它們會一直佔用內存直到你的方法退出,讓run循環處理釋放你的autoreleased對象。也就是說,即使並非所有這些都會在集合中結束,也會有很多自動釋放的對象在循環退出之前需要「排空」。添加@autoreleasepool {}圍繞內部循環,使stringEquation字符串和p謂詞經常自動釋放:

@autoreleasepool { 
    stringEquation = [NSString stringWithFormat:@"%d.0%@%d.0%@%d.0%@%d.0==24.0" 
        ,[[theNumbers objectAtIndex:a] intValue] 
        ,[someOperators objectAtIndex:v] 
        ,[[theNumbers objectAtIndex:b] intValue] 
        ,[someOperators objectAtIndex:w] 
        ,[[theNumbers objectAtIndex:c] intValue] 
        ,[someOperators objectAtIndex:x] 
        ,[[theNumbers objectAtIndex:d] intValue]]; 

    p = [NSPredicate predicateWithFormat:stringEquation]; 

    if ([p evaluateWithObject:nil]) { 

     [theMatches addObject:[NSString stringWithFormat:@"%ld,%ld,%ld,%ld,%ld,%ld,%ld",(long)a,(long)b,(long)c,(long)d,(long)v,(long)w,(long)x]]; 

     fourMatches = fourMatches + 1; 

    } 
}