人们说自动释放池可以快速释放自动释放的对象。但是有两种自动释放的对象:
在我看来,如果Apple希望获得最佳性能,那么它会让后者陷入困境。但是,如果id是内存指针而不是实际id,那么对前者执行相同操作是不可能的。
无论如何,自动释放池是否有自己的内存块来实现某些对象的快速释放?
答案 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.
*/
直接回答你的问题,不,没有这样的技巧。自动释放池只是有效地管理指针,而不是对象存储。