When designing a class hierarchy, sometimes the subclass has added a new initWithSomeNewParam
method, and it would be desirable to disable calls to the old
The syntax has been shortened to just:
- (instancetype)init NS_UNAVAILABLE;
initWith:Stuff and:OtherStuff should never be more than convenience constructors.
In that they effectively should call
self = [self init];
if(self)
{
self.stuff = Stuff;
self.other = OtherStuff;
}
so [object init] will always return an object in a predefined state, and [object initWithStuff:stuff] will return the object in the predefined state with stuff overridden.
Basically what I'm getting at is, its bad practice to discourage [object init] especially when someone subclasses your subclass in the future….
Flag it deprecated? Developers will be developers, you can't stop us all! ;-)
How do I flag a method as deprecated in Objective-C 2.0?
To add to what @DarkDust posted, you could alternatively use UNAVAILABLE_ATTRIBUTE
- (id)init UNAVAILABLE_ATTRIBUTE;
This will throw an error when a user tries to call init
on an instance of this class.
You can explicitly mark your init
as being unavailable in your header file:
- (id) init __unavailable;
or:
- (id) init __attribute__((unavailable));
With the later syntax, you can even give a reason:
- (id) init __attribute__((unavailable("Must use initWithFoo: instead.")));
The compiler then issues an error (not a warning) if someone tries to call it.