Hide the default Objective-C initializer
Languages like Java and C# let you override and hide the default constructors of a class, to ensure that developers can only create valid instances of it. Let’s take a look at how to do the same in Objective-C.
Hiding the default constructors of a class is particularly useful for constructor injection, to ensure that a class can not be created without providing it with a set of required components. Objective C, however, uses the init pattern when initializing class instances. It’s all good, but have some implications.
Consider a class that can be initialized with a required component, as such:
- (id)initWithMoreStuff:(id)moreStuff {
self = [self init];
if (self) {
self.moreStuff = moreStuff;
}
return self;
}
The big problem with this, is that if the class requires moreStuff
, a developer
can still call the default initializer to create an instance, where moreStuff
is nil.
One way to force initWithMoreStuff
to be used, is to throw an exception whenever
an instance is created with the default initializer. However, this is not good, since
developers can still use the default initializer, with the incorrect usage not being
detected until the app crashes at runtime.
What we want is to hide the default initializer and make initWithMoreStuff
the
only available one.
Achieving this is easy. In the .h file, just annotate the default initializer with
unavailable
, like this:
- (id)init __attribute__((unavailable("A descriptive reason")));
Now, you will get a compilation error if you try to use the default initializer.
Discussions & More
Please share any ideas, feedback or comments you may have in the Disqus section below, or by replying on Twitter or Mastodon..
If you found this text interesting, make sure to follow me on Twitter and Mastodon for more content like this, and to be notified when new content is published.
If you like & want to support my work, please consider sponsoring me on GitHub Sponsors.