Objective c 自动释放池是否有自己的内存板来实现快速释放?

Objective c 自动释放池是否有自己的内存板来实现快速释放?,objective-c,Objective C,人们说自动释放池可以快速释放自动释放的对象。但有两种自动释放的对象: 在初始化之后自动释放的那些,例如:[[NSString alloc]init]自动释放] 在创建过程中自动删除的内容,例如NSString stringWithFormat 在我看来,如果苹果想要获得最好的性能,它会把后者变成一块板子。但是,如果id是内存指针而不是实际id,则对前者执行相同操作是不可能的 无论如何,AutoRelaySo水池有自己的内存板来实现某些对象的快速分配吗? < P>一个不能确切地说出这一点(只有一个

人们说自动释放池可以快速释放自动释放的对象。但有两种自动释放的对象:

  • 在初始化之后自动释放的那些,例如:[[NSString alloc]init]自动释放]
  • 在创建过程中自动删除的内容,例如NSString stringWithFormat
  • 在我看来,如果苹果想要获得最好的性能,它会把后者变成一块板子。但是,如果id是内存指针而不是实际id,则对前者执行相同操作是不可能的


    无论如何,AutoRelaySo水池有自己的内存板来实现某些对象的快速分配吗?

    < P>一个不能确切地说出这一点(只有一个苹果工程师在泄露这个信息后会被解雇),但是如果你看看基础的替代解决方案/实现方式,例如GNUstep,你会看到“第二类型”。自动释放对象的创建方式如下:

    + (NSString *) stringWithString:(NSString *)otherString
    {
        return [[[self alloc] initWithString:otherString] autorelease];
    }
    
    但是,自动释放池仍然可以实现自己的方法来快速释放对象。您可以再看一次GNUstep的NSAutoreleasePool.m,以了解它的具体功能


    在我看来,您还不确定
    id
    是否是指针<强> < < /强>

    不能准确地说出这一点(只有一个苹果工程师在泄露这个信息后会被开除),但是如果你看看基础的替代解决方案/实现方式,例如GNUstep,你会发现“第二类型”自动保存的对象是用如下方式创建的:

    + (NSString *) stringWithString:(NSString *)otherString
    {
        return [[[self alloc] initWithString:otherString] autorelease];
    }
    
    但是,自动释放池仍然可以实现自己的方法来快速释放对象。您可以再看一次GNUstep的NSAutoreleasePool.m,以了解它的具体功能


    在我看来,您还不确定
    id
    是否是指针很方便,这是开源的!查看,特别是objc-arr.mm(对于像_objc_rootAlloc这样的东西,+alloc就是通过它来实现的),从那里您可以看到以下注释:

    /* Autorelease pool implementation
    A thread's autorelease pool is a stack of pointers. 
    Each pointer is either an object to release, or POOL_SENTINEL which is 
      an autorelease pool boundary.
    A pool token is a pointer to the POOL_SENTINEL for that pool. When 
      the pool is popped, every object hotter than the sentinel is released.
    The stack is divided into a doubly-linked list of pages. Pages are added 
      and deleted as necessary. 
    Thread-local storage points to the hot page, where newly autoreleased 
      objects are stored. 
    */
    

    不过,要直接回答你的问题,没有,没有这样的把戏。自动释放池只是有效地管理指针,而不是对象存储。

    很方便,这是开源的!查看,特别是objc-arr.mm(对于像_objc_rootAlloc这样的东西,+alloc就是通过它来实现的),从那里您可以看到以下注释:

    /* Autorelease pool implementation
    A thread's autorelease pool is a stack of pointers. 
    Each pointer is either an object to release, or POOL_SENTINEL which is 
      an autorelease pool boundary.
    A pool token is a pointer to the POOL_SENTINEL for that pool. When 
      the pool is popped, every object hotter than the sentinel is released.
    The stack is divided into a doubly-linked list of pages. Pages are added 
      and deleted as necessary. 
    Thread-local storage points to the hot page, where newly autoreleased 
      objects are stored. 
    */
    

    不过,要直接回答你的问题,没有,没有这样的把戏。自动释放池只是有效地管理指针,而不是对象存储。

    因此,假设我保留并保存stringWitFormat中的自动释放值。如果对象在“slab”中,会发生什么?您的“slab”被称为“zones”,它们被放弃了。因此,假设我保留并保存stringWitFormat中的自动释放值。如果对象在你的“板”中会发生什么?你的“板”被称为“区域”,它们被丢弃了。事实上,你可以知道,没有人被解雇!看到我的答案,并链接到来源:)@Josh Caswell我确实知道id是指针,但像往常一样,我质疑我所知道的,并承认我可能不知道一切事实上,没有人被炒鱿鱼你也能看出来!看到我的答案,并链接到来源:)@Josh Caswell我确实知道id是指针,但像往常一样,我质疑我所知道的,并承认我可能不知道一切酷,谢谢你的澄清。似乎我忽略了Obj-C运行时的一些部分…很酷,谢谢你的澄清。似乎我忽略了Obj-C运行时的一些部分。。。