使用大量自动释放的变量减少函数的内存占用量?

Joh*_*ter 4 performance memory-management objective-c autorelease

我仍然围绕着Objective-C的内存管理的一些细微差别,并提出了以下我不确定的案例:

+ (NSDecimalNumber*)factorial: (NSDecimalNumber *)l {

    NSDecimalNumber *index = l;
    NSDecimalNumber *running = [NSDecimalNumber one];

    for (; [index intValue] > 1; index = [index decimalNumberBySubtracting:[NSDecimalNumber one]]) {
        running = [running decimalNumberByMultiplyingBy: index];
    }
    return running;
}
Run Code Online (Sandbox Code Playgroud)

这里的decimalNumberByMultiplyingBy和decimalNumberBySubtracting将创建很多NSDecimalNumbers,最终将根据我的理解自动释放,但我担心,直到那时包含的程序将挂起大量的内存.

我应该在某个地方引入自动释放池吗?(如果是这样的话?)这会对性能产生明显的影响(与使用的这么多内存的副作用相比)吗?

自动释放正确的机制在这里使用?我应该看看打破循环并手动释放内存,因为我已经完成了它?

这可能是一个n00b问题,但我正试图了解这种情况下的最佳实践.

Jam*_*ton 5

最好避免在运行循环的单个传递中创建一堆大的自动释放对象.您似乎已经意识到了解决方案.您可以使用非自动释放的对象,并在完成它们后释放它们.您还可以为代码中创建大量自动释放对象的部分创建自动释放池.当一个对象被自动释放时,它会在释放/排出封闭的自动释放池时释放.使用自动释放池看起来像这样:

NSAutoReleasePool *subPool = [[NSAutoreleasePool alloc] init];
// Code that generates a bunch of autoreleased objects.
[subPool release];
Run Code Online (Sandbox Code Playgroud)

但是,在进行任何优化之前,请运行一些基准测试,看看是否确实需要进行优化.我的猜测是你所展示的方法不会造成任何问题.但是,假设您尝试将方法应用于单个循环中的一组一百万个随机整数.在这种情况下,您可能会从使用自动释放池中受益.

有关更多详细信息,请查看Apple的Cocoa内存管理编程指南.