我有一个要求,以创建一些NSDecimalNumber对象的对象为我的应用程序的一部分(如我要求他们提供计算的精度),但我注意到,在计算他们返回这些,想必,自动释放NSDecimalNumber对象。

我的问题是真的,这是否是一个iPhone应用程序,我可以进行大量的计算可能有问题。

问题是不只是涉及NSDecimalNumber具体但在制定iPhone应用程序的过程中,有时不可避免的创建自动释放物体。

在此点,如详细的答案将受到欢迎。

有帮助吗?

解决方案

是,在iPhone上创建大量自动释放实例可以创建内存问题,特别是在一个紧密的循环,这就是为什么我倾向于避免他们时,我可以。你可以创建自己的自动释放池来管理这一点,但他们也增加一些性能开销和额外的代码,你必须保持跟踪。

正是由于这个原因,当我做高精度计算,我倾向于使用NSDecimal C结构代替NSDecimalNumbers。事实上,我进行这方面的一些基准测试,发现与C结构去当一个显著的性能提升(从我的答案的此处):

NSDecimal

Additions per second: 3355476.75
Subtractions per second: 3866671.27
Multiplications per second: 3458770.51
Divisions per second: 276242.32

NSDecimalNumber

Additions per second: 676901.32
Subtractions per second: 671474.6
Multiplications per second: 720310.63
Divisions per second: 190249.33

可以看到,有一个几乎是在NSDecimal路径和NSDecimalNumber者之间的计算速度增加了五倍。在NSDecimal和NSDecimalNumber计算之间最大的区别是NSDecimalNumber实例的内存分配。因此,应该避免分配临时自动释放实例地方就可以。

其他提示

记住,你的可以的创建自己的NSAutoreleasePool对象。

例如:

for (int i = 0; i < 1000; ++i) {
  NSAutoreleasePool * p = [[NSAutoreleasePool alloc] init];
  for (int j = 0; j < 1000; ++j) {
    NSString * s = [NSString stringWithFormat:@"%d,%d", i, j];
    NSLog(@"%@", s);
  }
  [p release];
}

如果你这样做,你将永远不会在同一时间有超过1000这些字符串的内存。

如果你担心处理太多的自动释放的对象,你可以创建自己的自动释放池(见的存储器管理):

for (count = 0; count < limit; count++)
{
    NSAutoreleasePool *loopPool = [[NSAutoreleasePool alloc] init];
    NSString *fileContents;
    NSString *fileName;

    fileName = [args objectAtIndex:count];
    fileContents = [[[NSString alloc] initWithContentsOfFile:fileName] autorelease];
    // this is equivalent to using stringWithContentsOfFile:

    /* Process the file, creating and autoreleasing more objects. */

    [loopPool release];
}

这给出的存储器块中的每个对象将不得不放弃它。是当问题。

我尝试时,我可以给alloc/init/release,使物体只只要需要,他们流连。

如果我使用autorelease我有物体被释放时,在更小的控制。如果应用程序试图访问一个释放的对象,然后它可能会崩溃。因此,严格的内存管理是一件好事,我想。

只要您保留自动释放的对象从方法返回了,你应该没问题。 (除非你问别的事情,在这种情况下,我提前道歉。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top