Objective-C: How to use memory management properly for asynchronous methods

You could have -[MyClass startAsynchronousCode] invoke a callback:

typedef void(*DoneCallback)(void *);

-(void) startAsynchronousCode {
  // Lots of stuff
  if (finishedCallback) {
    finishedCallback(self);
  }
}

and then instantiate a MyClass like this:

MyClass *myClass = [[MyClass alloc] initWith: myCallback];

myCallback might look like this:

void myCallback(void *userInfo) {
  MyClass *thing = (MyClass *)userInfo;
  // Do stuff
  [thing release];
}

How are you invoking the asynchronous code? If you use NSThread +detachNewThreadSelector:toTarget:withObject:, you'll find that the target object is retained by the thread until it terminates and then it is released. So you can release the object immediately after the asynchronous message.

e.g.

@implementation MyClass

-(void) startAsynchronousCode
{
    [NSThread detachNewThreadSelector: @selector(threadMain:) toTarget: self withObject: nil];
}

-(void) threadMain: (id) anObject
{
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
    // do stuff
    [pool drain];
}
@end

With the above, the following code is perfectly safe:

MyClass* myClass = [[MyClass alloc] init];
[myClass startAsynchronousCode];
[myClass release];