在iPhone开发中创建自动释放对象

Uri*_*zen 1 memory iphone objective-c autorelease nsdecimalnumber

我需要创建一些NSDecimalNumber对象作为我的应用程序的一部分(因为我需要它们提供的计算精度)但我注意到在计算中它们返回NSDecimalNumber对象,这些对象可能是自动释放的.

我的问题是,在iPhone应用程序中我是否可能会进行大量计算,这是否存在潜在问题.

问题不仅仅与NSDecimalNumber有关,而是与开发iPhone应用程序时有时不可避免地创建自动释放的对象有关.

我们将非常感激地收到关于这一点的任何详细答案.

Dav*_*ong 8

请记住,您可以创建自己的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];
}
Run Code Online (Sandbox Code Playgroud)

如果你这样做,你一次在内存中永远不会有超过1000个字符串.


Bra*_*son 7

是的,在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
Run Code Online (Sandbox Code Playgroud)

如您所见,NSDecimal路径和NSDecimalNumber路径之间的计算速度几乎增加了五倍.NSDecimal和NSDecimalNumber计算之间的最大区别是NSDecimalNumber实例的内存分配.因此,您应该尽可能避免分配临时自动释放的实例.