It's worth mentioning the Cocoa Memory Management Rules here. If you are working in a non-GC environment e.g. iPhone, it's always worth mentioning them.
The fundamental rule state:
You take ownership of an object if you create it using a method whose name begins with “alloc” or “new” or contains “copy” (for example, alloc, newObject, or mutableCopy), or if you send it a retain message. You are responsible for relinquishing ownership of objects you own using release or autorelease. Any other time you receive an object, you must not release it.
Clearly you did not obtain obj with alloc, new... or something containing copy. So you do not own it.
In your code, the second of the corollaries is also relevant:
A received object is normally guaranteed to remain valid within the method it was received in (exceptions include multithreaded applications and some Distributed Objects situations, although you must also take care if you modify an object from which you received another object). That method may also safely return the object to its invoker
I have bolded the relevant part. You have modified the array from which you received the object, so it might go away. You either retain the object before removing it from the array or do the remove after you have finished with the object.
Actually, you might be safe even with the code in your question because NSMutableArray's implementation of of objectAtIndex: might do a retain followed by an autorelease on the return item. In a multithreaded environment that would be the only way to guarantee that the object remains valid for long enough to return it to the caller. However, I've not seen the code for NSMutableArray, so do not rely on it.
ETA: Just been looking at the thread programming guide and it appears that NSMutableAtrray does not do retain, autorelease.