In Objective-C, is it necessary to override all inherited constructors of a subclass to add custom initialization logic?
For example, would the following be correct for a UIView
subclass with custom initialization logic?
@implementation CustomUIView
- (id)init {
self = [super init];
if (self) {
[self initHelper];
}
return self;
}
- (id)initWithFrame:(CGRect)theFrame {
self = [super initWithFrame:theFrame];
if (self) {
[self initHelper];
}
return self;
}
- (id)initWithCoder:(NSCoder *)decoder {
self = [super initWithCoder:decoder];
if (self) {
[self initHelper];
}
return self;
}
- (void) initHelper {
// Custom initialization
}
@end
In general you should follow the designated initializer convention. The designated initializer is the init, that covers the initialization of all instance variables. The designated initializer is also the method that is called by other init methods of a class.
Apple's documentation about designated initializers.
initWithFrame:
is the designated initializer of the NSView class. Apple's Cocoa documentation always explicitly mentions the designated initializer of a class.initWithCoder:
is discussed here on SO.Every Cocoa Touch (and Cocoa) class has a designated initializer; for
UIView
, as stated in this documentation, that method isinitWithFrame:
. In this particular case, you'll only need to overrideinitWithFrame
; all other calls will cascade down and hit this method, eventually.This goes beyond the scope of the question, but if you do end up creating a custom initializer with extra parameters, you should make sure to the designated initializer for the superclass when assigning
self
, like this:In case of using Interface Builder, the one is called is :