# NSAutoreleasePool class reference

mccallum@gnu.ai.mit.edu
rfm@gnu.org
33521
2011-07-11 08:31:36 -0600 (Mon, 11 Jul 2011)
1995, 1996, 1997 Free Software Foundation, Inc.
Software documentation for the NSAutoreleasePool class
Foundation/NSAutoreleasePool.h

The standard OpenStep system of memory management employs retain counts. When an object is created, it has a retain count of 1. When an object is retained, the retain count is incremented. When it is released the retain count is decremented, and when the retain count goes to zero the object gets deallocated.

A simple retain/release mechanism has problems with passing objects from one scope to another, so it's augmented with autorelease pools. You can use the AUTORELEASE() macro to call the [NSObject -autorelease] method, which adds an object to the current autorelease pool by calling [NSAutoreleasePool +addObject:].
An autorelease pool simply maintains a reference to each object added to it, and for each addition, the autorelease pool will call the [NSObject -release] method of the object when the pool is released. So doing an AUTORELEASE() is just the same as doing a RELEASE(), but deferred until the current autorelease pool is deallocated.

The NSAutoreleasePool class maintains a separate stack of autorelease pools objects in each thread.

When an autorelease pool is created, it is automatically added to the stack of pools in the thread.

When a pool is destroyed, it (and any pool later in the stack) is removed from the stack.

This mechanism provides a simple but controllable and reasonably efficient way of managing temporary objects. An object can be autoreleased and then passed around and used until the topmost pool in the stack is destroyed.

Most methods return objects which are either owned by autorelease pools or by the receiver of the method, so the lifetime of the returned object can be assumed to be the shorter of the lifetime of the current autorelease pool, or that of the receiver on which the method was called.
The exceptions to this are those object returned by -

[NSObject +alloc] , [NSObject +allocWithZone:]
Methods whose names begin with alloc return an uninitialised object, owned by the caller.
[NSObject -init]
Methods whose names begin with init return an initialised version of the receiving object, owned by the caller.
NB. The returned object may not actually be the same as the receiver... sometimes an init method releases the original receiver and returns an alternative.
[NSObject +new]
Methods whose names begin with new combine the effects of allocation and initialisation.
[NSObject -copy] , [<NSCopying>-copyWithZone:]
Methods whose names begin with copy create a copy of the receiver which is owned by the caller.
[NSObject -mutableCopy] , [<NSMutableCopying>-mutableCopyWithZone:]
Methods whose names begin with mutableCopy create a copy of the receiver which is owned by the caller.
Warning the underscore at the start of the name of this instance variable indicates that, even though it is not technically private, it is intended for internal use within the package, and you should not use the variable in other code.
Warning the underscore at the start of the name of this instance variable indicates that, even though it is not technically private, it is intended for internal use within the package, and you should not use the variable in other code.
Warning the underscore at the start of the name of this instance variable indicates that, even though it is not technically private, it is intended for internal use within the package, and you should not use the variable in other code.
Warning the underscore at the start of the name of this instance variable indicates that, even though it is not technically private, it is intended for internal use within the package, and you should not use the variable in other code.
Warning the underscore at the start of the name of this instance variable indicates that, even though it is not technically private, it is intended for internal use within the package, and you should not use the variable in other code.
Warning the underscore at the start of the name of this instance variable indicates that, even though it is not technically private, it is intended for internal use within the package, and you should not use the variable in other code.
addObject:
anObj
Adds anObj to the current autorelease pool.
If there is no autorelease pool in the thread, a warning is logged and the object is leaked (ie it will not be released).
allocWithZone:
zone
Allocate and return an autorelease pool instance.
If there is an already-allocated NSAutoreleasePool available, save time by just returning that, rather than allocating a new one.
The pool instance becomes the current autorelease pool for this thread.
autoreleaseCountForObject:
anObject

Counts the number of times that the specified object occurs in autorelease pools in the current thread.

This method is slow and should probably only be used for debugging purposes.

currentPool
Return the currently active autorelease pool.
enableRelease:
enable

Specifies whether objects contained in autorelease pools are to be released when the pools are deallocated (by default `YES` ).

You can set this to `NO` for debugging purposes.

freeCache

When autorelease pools are deallocated, the memory they used is retained in a cache for re-use so that new polls can be created very quickly.

This method may be used to empty that cache, ensuring that the minimum memory is used by the application.

setPoolCountThreshhold:
c

Specifies a limit to the number of objects that may be added to an autorelease pool. When this limit is reached an exception is raised.

You can set this to a smallish value to catch problems with code that autoreleases too many objects to operate efficiently.

Default value is maxint.

addObject:
anObj
Adds anObj to this autorelease pool.
autorelease
Raises an exception - pools should not be autoreleased.
autoreleaseCount
Return the number of objects in this pool.
drain
Intended to trigger a garbage collection run (if needed) when called in a garbage collected environment.
In a non-garbage collected environment, this method implements the undocumented MacOS-X behavior, and releases the receiver.
emptyPool
Empties the current pool by releasing all the autoreleased objects in it. Also destroys any child pools (ones created after the receiver in the same thread) causing any objects in those pools to be released.
This is a low cost (efficient) method which may be used to get rid of autoreleased objects in the pool, but carry on using the pool.
release
Destroys the receiver (calls -dealloc).
retain
Raises an exception... pools should not be retained.