Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在15000次迭代之后,得到;错误:can';t分配区域--无内存警告_Objective C_Nsmutablearray_Xcode4.2_Automatic Ref Counting - Fatal编程技术网

Objective c 在15000次迭代之后,得到;错误:can';t分配区域--无内存警告

Objective c 在15000次迭代之后,得到;错误:can';t分配区域--无内存警告,objective-c,nsmutablearray,xcode4.2,automatic-ref-counting,Objective C,Nsmutablearray,Xcode4.2,Automatic Ref Counting,要点:使用圆弧; 完全错误为: malloc:*mmap(大小=2097152)失败(错误代码=12) 错误:无法分配区域 **在malloc\u error\u break中设置断点以进行调试 四次 问题的唯一实质性代码是: -(void)iterate:(NSString *)string{ frontString = NULL; backString = NULL; arrayOfNumbers = NULL; backwardArrayOfNumbers

要点:使用圆弧; 完全错误为:

malloc:*mmap(大小=2097152)失败(错误代码=12) 错误:无法分配区域 **在malloc\u error\u 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];
        }
    }
}
你知道问题出在哪里吗?提前谢谢


编辑:在
CString
NSString
之间转换是ARC的难点。因此我在循环中使用了
@autoreleasepool{}
(和
nil
而不是
NULL
),这大大减少了内存使用。我的迭代次数超过了50k次。

因此,如果程序使用了那么多内存,那么它本身就有一些问题——您可以显著减少此算法的内存使用

无论如何,如果这发生在主线程上,您不会得到内存警告。内存警告是在主线程上发出的,您不会给它机会处理该警告,因为在主线程的运行循环有机会执行其常规工作(例如处理内存警告或处理其他事件)之前,内存已耗尽


如果在次线程上发生这种情况,您可能会看到一些不同的情况,但这并不能解决问题的根源。

因此,如果程序使用了那么多内存,那么程序本身就存在一些问题--您可以显著减少此算法的内存使用

无论如何,如果这发生在主线程上,您不会得到内存警告。内存警告是在主线程上发出的,您不会给它机会处理该警告,因为在主线程的运行循环有机会执行其常规工作(例如处理内存警告或处理其他事件)之前,内存已耗尽


如果在次线程上发生这种情况,您可能会看到一些不同的情况,但这并不能解决问题的根源。

您正在递归地解决一个占用内存的问题

当你的电脑完成15000个循环时,你必须跟踪它要去哪里。这可以成为一个很大的空间

如果有可能使这个“尾部递归”,您可以节省空间。例如:

"bad" recursion which saves in memory 7 + 6 + 5 + 4 + 3 + 2
int factorial (int x)
{
  if (x > 1)
  {
     return (x + recursion (x - 1));
  }
  else return x;
}
//


您正在递归地解决一个占用内存的问题

当你的电脑完成15000个循环时,你必须跟踪它要去哪里。这可以成为一个很大的空间

如果有可能使这个“尾部递归”,您可以节省空间。例如:

"bad" recursion which saves in memory 7 + 6 + 5 + 4 + 3 + 2
int factorial (int x)
{
  if (x > 1)
  {
     return (x + recursion (x - 1));
  }
  else return x;
}
//


我读对了吗?你真的要深入到15000个级别的递归,你想知道为什么内存不足吗?不,我想知道为什么NSMutableArray的内存不足我在函数环境中看到的容量的三分之一。递归过程本身会消耗内存吗?每次递归时,都会创建这些数组的一个新副本。但是,一旦我将它们设置为NULL,每个数组都会与ARC解除分配,是吗?我读对了吗?你真的要深入到15000个级别的递归,你想知道为什么内存不足吗?不,我想知道为什么NSMutableArray的内存不足我在函数环境中看到的容量的三分之一。递归过程本身会消耗内存吗?每次递归时,都会创建这些数组的一个新副本。但是,一旦我将它们设置为NULL,每个数组都会与ARC解除分配,是吗?好吧,这对我来说是胡说八道,这意味着我遗漏了一个要点。这和我的代码有什么关系?好吧,这对我来说是胡说八道,这意味着我遗漏了一个要点。这与我的代码有什么关系?“您可以显著减少此算法的内存使用。”--这是怎么回事?迭代,不要递归,经常显式创建和销毁自动释放池,不自动释放任何内容(在您的实现中),仅存储数字时使用数字而不是字符串,尽可能使用c类型。那些IVAR你在入口处无效-你会释放它们吗?然后回顾和分析,再做一次。可以使用C类型的少量堆栈空间来形成实现的主要部分。c实现的执行速度也会快很多倍。即使使用不自动释放的CF类型也会帮助您更好地理解这个问题。“您可以显著减少此算法的内存使用。”--这是怎么回事?迭代,不要递归,经常显式创建和销毁自动释放池,不自动释放(在您的实现中),在仅存储数字时使用数字而不是字符串,尽可能使用c类型。那些IVAR你在入口处无效-你会释放它们吗?然后回顾和分析,再做一次。可以使用C类型的少量堆栈空间来形成实现的主要部分。c实现的执行速度也会快很多倍。即使使用没有自动释放的CF类型也会帮助您更好地理解这个问题。
good recursion start with y = 1
only saves in memory two integers, updating them every cycle.
int factorial (int x, int y)
{
  if (x > 1)
  {
     return factorial (x - 1, (x * y));
  }
  else return x;
}