如何在Objective C中正确初始化子类?

Gol*_*Joe 2 iphone initialization objective-c uiview ios

我有两个UIViews.它们都需要自定义初始化,并且在initWithFrame:和initWithCoder:中简单地复制初始化代码似乎是重复且容易出错的.但是,使用像initMyStuff这样的标准初始化方法名称会导致子类的版本被调用两次.我可以通过给每个类一个唯一的初始化名称来解决这个问题,比如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];
Run Code Online (Sandbox Code Playgroud)

Rob*_*ier 7

CustomViewChild不应该打电话initMyStuff.只需在父母中调用它,孩子initMyStuff应该调用[super initMyStuff].

但在任何一种情况下,都不要调用它,initMyStuff因为这表明它是一种init方法,这意味着某些行为.取名类似setup(假设我们的目标是把它从两个叫initWithFrameinitWithCoder:).