2

在C和C++中,我使用流行的内存池分配器。在内存中分配了大量内存,然后在内部分配所有小对象。完成后,所有内容都可以通过一次调用释放。我能够以10倍的速度加速我的应用程序的一些瓶颈。我可以创建自己的内存管理来处理可可对象

问题是我该如何与可可做到这一点?

如何覆盖alloc方法?

回答

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无法释放该对象使用的内存,但可能需要释放其他资源。

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

如果您正在寻找一种解决方案,可以让您在像这样的池中分配任何类的对象,那么您的运气不好。使用NSZoneallocWithZone:可能有助于分配速度,但无法一次释放区域内的所有对象。

但是,如果您确定您的对象分配是性能问题,那么您只有在分析后才应该执行此操作。他们通常不是。

+0

+1分析建议。 – 2010-10-12 14:22:36