Memory management in Objective-C is semi-automatic, requiring the programmer to allocate memory for objects using alloc or convenience constructors, but not requiring de-allocation. Every object has a reference counter that tracks the number of references retaining it; sending retain increments the counter, while release decrements it. When the reference counter reaches zero, the object is automatically de-allocated. The programmer must follow rules to balance allocations, retains and releases. Autorelease pools are used to defer releasing of objects until the pool is drained. Newer versions of Xcode use Automatic Reference Counting (ARC) to automate more of memory management.