You can pretty much rest assured that your app is going to get killed at least some of the time. Thus, defending against exits the like of exit(0);
is required.
However, NSApplication implements the -terminate:
method.
[NSApp terminate: nil];
ought to do what you want.
I would generally suggest posting it via -performSelector:afterDelay:
with a delay of 0.0 to force it to happen at the top of the next pass through the event loop.
Example:
[NSApp performSelector:@selector(terminate:) withObject:nil afterDelay:0.0];