我需要创建一些NSDecimalNumber
对象作为我的应用程序的一部分(因为我需要它们提供的计算精度)但是我注意到在计算中它们返回NSDecimalNumber对象,这些对象可能是自动释放的。
我的问题是在iPhone应用程序中是否存在潜在问题,我可能会进行大量计算。
问题不仅仅与NSDecimalNumber有关,而且与开发iPhone应用程序时有时不可避免地创建自动释放的对象有关。
我们将非常感激地收到关于这一点的任何详细答案。
答案 0 :(得分: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];
}
如果你这样做,你一次在内存中永远不会有超过1000个字符串。
答案 1 :(得分:7)
是的,在iPhone上创建大量自动释放的实例会造成内存问题,特别是在紧密循环中,这就是为什么我倾向于尽可能避免它们。您可以创建自己的自动释放池来管理它,但它们还会增加一些性能开销和您必须跟踪的其他代码。
正是由于这个原因,当我进行高精度计算时,我倾向于使用NSDecimal C结构而不是NSDecimalNumbers。实际上,我对此进行了一些基准测试,发现在使用C结构(从我的回答here复制)时性能显着提高:
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实例的内存分配。因此,您应该尽可能避免分配临时自动释放的实例。
答案 2 :(得分:3)
如果您担心处理太多自动释放的对象,可以创建自己的自动释放池(请参阅memory management):
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];
}
答案 3 :(得分:0)
给予一大块记忆的每个对象都必须放弃它。问题是什么时候。
我尽可能地尝试alloc/init/release
,因此只要需要它们,对象就会挂起。
如果我使用autorelease
,我对发布对象的时间控制较少。如果应用程序尝试访问已释放的对象,则它可能会崩溃。我认为,更严格的内存管理是一件好事。
只要您保留从方法返回的自动释放对象,您应该没问题。 (除非你问别的事情,否则我会事先道歉。)