2つのUIViewがあります。どちらもカスタム初期化が必要であり、initWithFrame:とinitWithCoder:の両方で初期化コードをコピーするだけで繰り返し発生し、バグが発生しやすいようです。ただし、initMyStuffのような標準の初期化メソッド名を使用すると、子のバージョンが2回呼び出されます。これは、各クラスにinitStuffForCustomViewParentのような一意の初期化名を付けることで解決できますが、コードを読みやすくするために、標準のカスタム初期化メソッド名を維持する方法があればいいのですが。問題の実装例は次のとおりです。
@implementation CustomViewParent
-(id)initWithFrame:(CGRect)aRect
{
if(self=[super initWithFrame:aRect])
[self initMyStuff];
return self;
}
-(id)initWithCoder:(NSCoder *)aDecoder
{
if(self = [super initWithCoder:aDecoder])
[self initMyStuff];
return self;
}
-(void)initMyStuff
{
// Do stuff (never called)
}
@end
@implementation CustomViewChild
-(id)initWithFrame:(CGRect)aRect
{
if(self=[super initWithFrame:aRect])
[self initMyStuff];
return self;
}
-(id)initWithCoder:(NSCoder *)aDecoder
{
if(self = [super initWithCoder:aDecoder])
[self initMyStuff];
return self;
}
-(void)initMyStuff
{
// Do stuff (called twice)
}
@end
// SAMPLE
// Calls CustomViewChild's initMyStuff twice and CustomViewParent's initMyStuff never
CustomViewChild *obj = [[CustomViewChild alloc] init];