-
-
Save aprato/9490262 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#ifndef NS_DESIGNATED_INITIALIZER | |
#if __has_attribute(objc_designated_initializer) | |
#define NS_DESIGNATED_INITIALIZER __attribute((objc_designated_initializer)) | |
#else | |
#define NS_DESIGNATED_INITIALIZER | |
#endif | |
#endif |
How to Adopt
Identify designated initializers in your classes, and tag them with the NS_DESIGNATED_INITIALIZER
macro. For example:
- (instancetype)init NS_DESIGNATED_INITIALIZER;
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
From my still open tab...
In Objective-C, object initialization is based on the notion of a designated initializer, an initializer method that is responsible for calling one of its superclass’s initializers and then initializing its own instance variables. Initializers that are not designated initializers are known as secondary initializers. Secondary initializers typically delegate to another initializer—eventually terminating the chain at a designated initializer—rather than performing initialization themselves.
The designated initializer pattern helps ensure that inherited initializers properly initialize all instance variables. A subclass that needs to perform nontrivial initialization should override all of its superclass’s designated initializers, but it does not need to override the secondary initializers. For more information about initializers, see “Object Initialization”.
To clarify the distinction between designated and secondary initializers clear, you can add the
NS_DESIGNATED_INITIALIZER
macro to any method in the init family, denoting it a designated initializer. Using this macro introduces a few restrictions:init
method (with[super init...]
) that is a designated initializer for the superclass.[self init...]
).If any of these restrictions are violated, you receive warnings from the compiler.