Article Title: Using the singleton NSDocumentController and sharedDocumentController Article Year: 2018 Article Status: Static Author: Robert Walliczek Author E-mail Contact: galaxyverge+how2@pm.me ------- Summary ------- To use a custom instance of NSDocumentController, make a subclass of NSDocumentController and initialize it within its "load" class method. For example: @implementation DocumentController +(void)load { [DocumentController new]; } [NSDocumentController sharedDocumentController] then points to its instance. ---------------------------- Complete Objective-C Example ---------------------------- // AppKit contains NSDocumentController: #import // Design and initialize a subclass of NSDocumentController soon to make it NSDocumentController's sharedDocumentController: // DocumentController.h @interface DocumentController : NSDocumentController @end // DocumentController.m #import "DocumentController.h" @implementation DocumentController +(void)load { [DocumentController new]; } @end // Use with an object the subclass instance as NSDocumentController's sharedDocumentController: // Object.h @interface Object : NSObject @end // Object.m #import "Object.h" #import "DocumentController.h" @implementation Object -(void)method { DocumentController *dc = [NSDocumentController sharedDocumentController]; } @end ----------- Explanation ----------- NSDocumentController is a "singleton" class. There is only ever one NSDocumentController instance in an application. The first subclass instance of NSDocumentController that calls NSDocumentController's init method becomes NSDocumentController's sharedDocumentController, the only possible NSDocumentController instance in the application. Calling init again will always return the same object instance as calling sharedDocumentController, unlike most other class initializer methods which initialize new instances. So it is best to initialize the document controller early, such as in the "load" class method. ----- Links ----- NSDocumentController documentation: https://developer.apple.com/documentation/appkit/nsdocumentcontroller?language=objc Leslie Godwin suggests initializing in the "load" class method: https://stackoverflow.com/a/35126905/2846508