创建于iPhone开发自动释放对象
-
18-09-2019 - |
题
我有一个要求,以创建一些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
我有物体被释放时,在更小的控制。如果应用程序试图访问一个释放的对象,然后它可能会崩溃。因此,严格的内存管理是一件好事,我想。
只要您保留自动释放的对象从方法返回了,你应该没问题。 (除非你问别的事情,在这种情况下,我提前道歉。)