在C和C ++中,我使用流行的内存池分配器。在分配了大量内存然后在其中分配所有小对象的情况下。完成后,只需一次通话即可释放所有内容。我能够通过因子10加速我的应用程序的一些瓶颈。
问题是如何用Cocoa做到这一点?
如何覆盖alloc方法?
答案 0 :(得分:2)
您可以像其他任何类方法一样覆盖alloc
或allocWithZone:
。它需要为实例分配内存并设置isa
指针。像这样的东西会起作用:
void *memoryPool;
void *nextObject;
+ (id) alloc;
{
id result = (id)nextObject;
size_t instanceSize = class_getInstanceSize( self );
nextObject += instanceSize;
memset( result, 0, instanceSize );
result->isa = self;
return result;
}
+ (id) allocWithZone: (NSZone *) zone;
{
return nil;
}
- (void) dealloc; { /* do nothing */ }
实现这些方法的类的每个子类都将被分配到memoryPool
的缓冲区中。分配缓冲区nextObject
时必须设置为相同的缓冲区。完成这些对象后,您可以通过释放memoryPool
来解除所有对象的释放。
请注意,这还不完美。您可能应该跟踪每个已分配对象的位置,以便在释放池之前调用其dealloc
方法。 Dealloc无法释放对象使用的内存,但可能需要释放其他资源。
您还需要确保在释放之前没有对池中对象的任何引用。
如果您正在寻找一个允许您在这样的池中分配任何类的对象的解决方案,那么您运气不好。使用带有NSZone
的{{1}}可能有助于分配速度,但无法一次释放区域内的所有对象。
但是如果您确定对象分配是性能问题,那么只有在进行性能分析后才真正应该这样做。通常他们不是。