when ARC is on, the LOCAL controller is released right after its showWindow call! but as windows are deferred, the window isn't even there yet -- and even it were, it would be 'controller-less'
the Window does NOT retain its controller :) only vice-versa
the fix is to remember a reference to the controller Until your appDelegate is deallocated/until you quit
@implementation AppDelegate {
myWindowController* _controller;
}
...
_controller = [[myWindowController alloc] initWithWindowNibName:@"myMainWindow"];
[_controller showWindow:self];
your code works without arc because no release of controller happens and it just leaks! ARC does add a release call though (as it correctly sees controller is no longer used)