http://i46.tinypic.com/2nquzag.png
非常に長い計算の過程で数百万のNSNumberを作成してリリースするアプリがあります。これらのオブジェクトを作成および処理するさまざまなループで@autoreleasepoolsを使用しています。機器の画面の上限からわかるように、生きているCFNumberは10656個しかありませんが、この時点で、他のオブジェクトにメモリを割り当てることができないため、アプリがクラッシュします。「一時的な」状態のCFNumberは5700万を超えています。これは彼らが解放されることを意味しますか?なぜmallocはこれらのメモリ位置をまだ使用しないのですか?
使用しているコードのモックアップを含めました。testProbabilitiesメソッドを実行すると、10000回の反復ごとにカウントされます。割り当てエラーが発生する前に、このコードで最大790000回の反復が発生しています。それでも、Instrumentsは私には良さそうです。
@implementation MMTest
NSMutableSet *predictedSet;
-(NSMutableArray *)calculateCDF {
//// NORMALIZE PROBABILITIES ////
float probabilitySum = 0;
float runningCDFTotal = 0;
float normaledProbability = 0;
@autoreleasepool {
NSMutableArray *CDF = [[NSMutableArray alloc] init];
probabilitySum = 4.5; ////This is just a placholder for additive iteration of an array which creates this sum.
//// CREATE CDF ////
int x;
for (x=0; x<50; x++) {
normaledProbability = .2/probabilitySum;////This is placeholder for calculation on same array as above.
runningCDFTotal += normaledProbability;
[CDF addObject:[NSNumber numberWithFloat:runningCDFTotal]];
}
return CDF;
}
}
-(NSMutableSet *)generateNumbers {
@autoreleasepool {
int x;
double r = 0;
if (!predictedSet) {
predictedSet = [[NSMutableSet alloc] init];
}
else {
[predictedSet removeAllObjects];
}
for (x=0; x<5;) {
r = arc4random_uniform(1000)/1000;////I'm actually using SFMT here instead.
int num = 0;
__weak id CDF = [self calculateCDF];
if (r <= [[CDF objectAtIndex:[CDF count]-1] floatValue]) {
for (NSNumber *cdf in CDF) {
if (r <= [cdf floatValue]) {
num = [CDF indexOfObject:cdf]+1;
[predictedSet addObject:[NSNumber numberWithInt:num]];
x++;
break;
}
}
}
}
return predictedSet;
}
}
-(void)testProbability {
int x = 0;
BOOL nextSetFound = NO;
NSSet *nextSet = [[NSSet alloc] initWithObjects:
[NSNumber numberWithInt:1],
[NSNumber numberWithInt:2],
[NSNumber numberWithInt:3],
[NSNumber numberWithInt:4],
[NSNumber numberWithInt:5],
nil];
while (nextSetFound == NO) {
@autoreleasepool {
__weak id newSet = [self generateNumbers];
x++;
if ([nextSet isSubsetOfSet:newSet]) {
nextSetFound = YES;
NSLog(@"%@", newSet);
}
if (fmod (x,10000) == 0) {
NSLog(@"%i", x);
}
}
}
NSLog(@"%i", x);
}
@end