2

在 C 和 C++ 中,我使用流行的内存池分配器。分配了一大块内存,然后在其中分配了所有小对象。完成后,只需一次调用即可释放所有内容。我能够将我的应用程序的一些瓶颈加速 10 倍。

问题是我怎么能用 Cocoa 做到这一点?

如何覆盖 alloc 方法?

4

1 回答 1

2

您可以覆盖allocallocWithZone:喜欢任何其他类方法。它需要为实例分配内存并设置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 无法释放对象使用的内存,但可能需要它来释放其他资源。

在释放池之前,您还需要确保没有对池中对象的任何引用。

如果您正在寻找一种允许您在这样的池中分配任何类的对象的解决方案,那么您就不走运了。使用NSZonewithallocWithZone:可能有助于提高分配速度,但无法一次释放区域内的所有对象。

但是如果你确定你的对象分配是一个性能问题,你真的应该在分析之后才这样做。通常他们不是。

于 2010-10-12T12:37:44.927 回答