ポイント:ARCを使用。 完全なエラーは:15000回の反復後、「エラー:領域を割り当てることができません」 - メモリ警告なし
malloc: * mmap(size=2097152) failed (error code=12) error: can't allocate region ** set a breakpoint in malloc_error_break to debug
4回です。
質問への任意の物質の唯一のコードは次のとおりです。問題が何であるか
- (void)didReceiveMemoryWarning
{
NSLog(@"Error near iteration %ld", iteration);
[super didReceiveMemoryWarning];
}
任意のアイデア:
-(void)iterate:(NSString *)string{
frontString = NULL;
backString = NULL;
arrayOfNumbers = NULL;
backwardArrayOfNumbers = NULL;
nextString = NULL;
nextArrayOfNumbers = NULL;
nextArrayOfNumbers = [NSMutableArray new];
nextString = [NSMutableString new];
backwardArrayOfNumbers = [NSMutableArray new];
arrayOfNumbers = [NSMutableArray new];
frontString = [[NSMutableString alloc] initWithString:string];
backString = [NSMutableString new];
if (string.length > 1) {
iteration++;
for (unsigned long i = 0; i < string.length; ++i) {
NSString *sub = [string substringWithRange:(NSRange){i, 1}];
[arrayOfNumbers addObject:sub];
NSString *back = [string substringWithRange:(NSRange){string.length-(i+1), 1}];
[backwardArrayOfNumbers addObject:back];
[backString appendString:back];
sub = NULL;
back = NULL;
}
if ([frontString isEqualToString:backString]) {
[palindromicNumberTextView setText:string];
[iterationLabel setText:[NSString stringWithFormat:@"%ld", iteration]];
} else {
int carrier = 0;
for (long long j = arrayOfNumbers.count-1; j > -1; --j) {
int a = [[arrayOfNumbers objectAtIndex:j] intValue];
int b = [[backwardArrayOfNumbers objectAtIndex:j] intValue];
//NSLog(@"a = %i, b = %i", a, b);
int c = a+b+carrier;
if (c > 9) {
c = c-10;
carrier = 1;
} else {
carrier = 0;
}
[nextArrayOfNumbers addObject:[NSString stringWithFormat:@"%i", c]];
if (carrier == 1 && (nextArrayOfNumbers.count == arrayOfNumbers.count)) {
[nextArrayOfNumbers addObject:[NSString stringWithFormat:@"%i", carrier]];
}
//NSLog(@"nextArrayOfNumbers = %@", nextArrayOfNumbers);
}
for (int i = 0; i < nextArrayOfNumbers.count; ++i) {
NSString *back = [nextArrayOfNumbers objectAtIndex: nextArrayOfNumbers.count-(i+1)];
//NSLog(@"back = %@", back);
[nextString appendString:back];
back = NULL;
}
if (iteration%1000 == 0) {
NSLog(@"iteration %ld; count:%u", iteration, nextArrayOfNumbers.count);
}
//NSLog(@"iteration %ld", iteration);
[self iterate:nextString];
}
}
}
15,000メモリーなしの警告と反復の後に、クラッシュ+エラー、 ?前もって感謝します!
編集:CString
とNSString
の間の変換は、ARCの痛みです。だから私はループ内に@autoreleasepool{}
(そして、NULL
ではなくnil
)と一緒に行き、それは劇的にメモリ使用量を減らしました。私は50k回以上の反復をしています。
は、私はこの権利を読んでいますか?あなたは真剣に再帰の深さが15,000レベルに達していますか?そして、なぜあなたは記憶がなくなっているのだろうと思いますか? –
いいえ、私は機能的な環境で見たものの3分の1以下のNSMutableArrayを使ってメモリが不足しているのだろうと思います。再帰のプロセス自体が記憶を食べるか? – AMayes
再帰するたびに、これらの配列の新しいコピーを作成します。 –