NSString吃掉了记忆

时间:2014-01-26 23:35:35

标签: memory for-loop nsstring

我有一系列11个for循环嵌入彼此,所有这些都是0-5:

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变量,但我会节省内存,而不是增加它的使用。

感谢。

1 个答案:

答案 0 :(得分:2)

由于你有很多嵌套循环,原因可能是因为你的代码确实可以使用大量内存:11个循环,每个循环完成6次,给你六个11的幂,或362797056潜在的匹配,所以您可以在theMatches集合中存储尽可能多的字符串对象。

然而,更可能的原因是你有很多未决的自动释放对象。它们没有被使用,但它们会一直占用内存,直到你的方法退出,让运行循环处理释放自动释放的对象。也就是说,即使不是所有这些都会在集合中结束,也会有很多自动释放的对象需要在循环退出之前“排干”。在最里面的循环周围添加@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;

    }
}