You always use pointers, because OOP-objects are allocated on heap and in C C-objects (what C calls an object, everything "living" at runtime and having an address including OOP-objects) with the storage class allocated are always referred using a pointer. For OOP-objects this is a pointer to an object, very often called object reference.
In detail:
NSString *pointer = [NSString new]; // pointer is a pointer to an object, an object reference … [pointer doSomething]; // pointer *is* a pointer, so a pointer *is* used.
Probably you want to ask, when to use the asterisk * for object references as in NSString*? Only in a type definition (including casting), because in an expression it would mean dereference the pointer. The result would be an OOP-object itself (not its reference). But you always use the pointer for OOP-objects.
[*pointer doSomething]; *pointer is an object. But you address receiver of messages using a pointer, not an object