In review of a project today, I realize I need to write down some general rules on memory management around Objective-C.

I'm going to write more on this but here are some general rules:

Case 1. Setting properties.

Obj *obj = [[obj alloc] init];
myClient.obj = obj;
[obj release];


This assumes the property is either retain or copy. Either way, it's the receiver's responsibility to make sure the memory is being retained.

Case 2: Returning obj

- (Obj) foo{
Obj *obj = [[[Obj alloc] init] autorelease];
return obj;
}


When sending an obj as return, always set it to auto release. This is basically the same principle as "Clean up after yourself".

Case 3: Array Manipulation

Sometimes you need to create a Mutable Array, populate it and return an Array. What I recommend is the following:

- (NSArray) foo{
NSMutableArray *tmpArray = [[NSMutableArray alloc] init];
... Build the array.. read from the database and populate it, etc.
NSArray *rtnArray = [NSArray ArraywithArray:tmpArray]; //This is an autorelease copy.
[tmpArray release];
return rtnArray;

That's the basic cases I have in mind right now. I will continue to write as I come across them this weekend.