Баллов: с помощью ARC;
полная ошибка:
malloc: * mmap (размер = 2097152) не удалось (код ошибки = 12)
ошибка: невозможно выделить регион
** установить точку останова в malloc_error_break для отладки
четыре раза.
Единственный код любого вещества к вопросу:
-(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 + итераций позже, сбой + ошибка, без предупреждения о памяти:
- (void)didReceiveMemoryWarning
{
NSLog(@"Error near iteration %ld", iteration);
[super didReceiveMemoryWarning];
}
Есть идеи, в чем может быть проблема? Заранее спасибо!
РЕДАКТИРОВАТЬ: преобразование между CString
и NSString
является болью с ARC. Так что я пошел с @autoreleasepool{}
внутри циклов (и nil
вместо NULL
), и это значительно сократило использование памяти. У меня более 50 тысяч итераций.