2

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];
4

1 に答える 1

7

CustomViewChildを呼び出すべきではありませんinitMyStuff。親でこれを呼び出すだけで、子initMyStuffはを呼び出す必要があります[super initMyStuff]

ただし、どちらの場合も、特定の動作を意味するメソッドであるinitMyStuffことを示唆しているため、呼び出さないでください。initそれを次のように呼び出しますsetup(目標がとの両方から呼び出されるようにすることであると想定しますinitWithFrameinitWithCoder:

于 2012-09-27T18:55:38.310 に答える