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

时间:2012-01-21 13:57:42

标签: objective-c

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

  1. 初始化后自动释放的那些[[[NSString alloc] init] autorelease]
  2. 在创作期间自动释放的那些,例如NSString stringWithFormat。
  3. 在我看来,如果Apple希望获得最佳性能,那么它会让后者陷入困境。但是,如果id是内存指针而不是实际id,那么对前者执行相同操作是不可能的。

    无论如何,自动释放池是否有自己的内存块来实现某些对象的快速释放?

2 个答案:

答案 0 :(得分:3)

人们无法准确地说出这一点(只有苹果工程师在泄露此信息后才会被解雇),但是如果你看一下Foundation的替代解决方案/实现,例如GNUstep,你会看到“第二 - 类型“自动释放对象的创建方式如下:

+ (NSString *) stringWithString:(NSString *)otherString
{
    return [[[self alloc] initWithString:otherString] autorelease];
}

但是,自动释放池仍然可以实现自己的方法来快速释放对象。你可以再一次看看GNUstep的NSAutoreleasePool.m,看看它究竟是做什么的。

在我看来,你不确定id是否是指针。

答案 1 :(得分:3)

方便的是,这是开源的!查看http://www.opensource.apple.com/source/objc4/objc4-493.9/,特别是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. 
*/

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