From reading the memory management docs in the SDK, I gathered that factory methods (static constructor methods) would typically be retaining the object for me and adding it to the autorelease pool?
This would mean I have no need to retain & release an object as long as the pool does not get released before I expect? (Which should be at the end of the app, for the default autorelease pool in main()? )
This question: Cocoa Touch Question. Should [NSMutableArray array] be retained? seems to agree with this.
However when I have used the NSMutableArray arrayWithCapacity: method, I’ve found I have to retain the array or all heck breaks loose.
I’m sure this is all just total n00b-ness, or a bizarre bug elsewhere in the code, but if someone could explain how exactly I may have misunderstood, I’d be much obliged.
Thanks!
Update: Thanks for the answers. I think I’ve got it now!
Yes, you don’t have to worry about releasing objects returned from any method, except the
alloc,init,new, andcopymethods.Yes.
No. You can only count on the object being around until you return from whichever method or function you’re in. Typically, autorelease pools are flushed when control returns back to your run loop.
If you want an object instance to survive beyond the current method you must take ownership of it, by calling ‘retain’. You are then also responsible for ‘releasing’ the instance when you no longer need it.
In your case, if you want your NSMutableArray to stick around, you need to
retainit. Better yet, use[[NSMutableArray alloc] initWithCapacity: ];See Practical Memory Management