代码之家  ›  专栏  ›  技术社区  ›  Lothar

我能创建自己的内存管理来处理Cocoa对象吗

  •  2
  • Lothar  · 技术社区  · 15 年前

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

    问题是我怎么用可可粉做这个?

    如何覆盖alloc方法?

    1 回复  |  直到 15 年前
        1
  •  2
  •   Sven    15 年前

    您可以覆盖 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 必须设置为相同的缓冲区。处理完这些对象后,可以通过释放 记忆工具 .

    请注意,这还不是完美的。您可能应该跟踪每个分配对象的位置,以便可以调用它们 dealloc 方法在释放池之前。Dealloc无法释放对象使用的内存,但可能需要释放其他资源。

    NSZone 具有 可能有助于提高分配速度,但无法同时释放区域内的所有对象。

    但是,如果您确定对象分配是性能问题,那么您确实应该在分析之后执行此操作。他们往往不是。