在C和C++中,我使用流行的内存池分配器。在内存中分配了大量内存,然后在内部分配所有小对象。完成后,所有内容都可以通过一次调用释放。我能够以10倍的速度加速我的应用程序的一些瓶颈。我可以创建自己的内存管理来处理可可对象
问题是我该如何与可可做到这一点?
如何覆盖alloc方法?
在C和C++中,我使用流行的内存池分配器。在内存中分配了大量内存,然后在内部分配所有小对象。完成后,所有内容都可以通过一次调用释放。我能够以10倍的速度加速我的应用程序的一些瓶颈。我可以创建自己的内存管理来处理可可对象
问题是我该如何与可可做到这一点?
如何覆盖alloc方法?
与其他类方法一样,您可以覆盖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
和allocWithZone:
可能有助于分配速度,但无法一次释放区域内的所有对象。
但是,如果您确定您的对象分配是性能问题,那么您只有在分析后才应该执行此操作。他们通常不是。
+1分析建议。 – 2010-10-12 14:22:36