Local variables have automatic duration, meaning they go away when a function exits. When local variables are bound directly to values, the values also must cease to exist when the function exits. PHP uses references (though "alias" is a better match, technically, for what PHP uses) for values that must exist beyond the invocation of a function that creates them, so they can have dynamic duration. It also uses garbage collection (the implementation of which has changed in 5.3) to manage the lifetimes of these values. You don't normally have to use references explicitly, as (true) references are used automatically for class types and references aren't as necessary with value types.
Where PHP has references, Objective-C has pointers, which come from its C roots. Pointers let you dynamically allocate objects so they endure outside the function call chain (i.e. the stack). You can have garbage collection in Cocoa, but that's a newer feature. The previous technique, which is based on reference counting, is still very viable (and the only option in iOS and some non-Apple Objective-C implementations).
Without pointers (or references), objects would live entirely on the stack and would need to be copied when entering or leaving a function. Objects store state; copying an object means the original's state wouldn't be updated when the copy takes some action and alters its state. Sometimes this wouldn't be a problem, whereas other times it would be a fatal flaw. Imagine what would happen with input or output streams if I/O functions could only work on copies.