带参数的Init和init

时间:2012-06-18 11:57:58

标签: objective-c class initialization

以下是代码:

@implementation Accumulateur

    // Constructor
    - (id) init
    {
        return ([self initWithTotal:0]);
    }

    - (id) initWithTotal:(int)aTotal
    {
        AccumulateurMoyen   *ac;

        if ((ac = [[AccumulateurMoyen alloc] init]) == nil)
        {
            [self release];
            return (nil);
        }
        return ([self initWithTotal:aTotal andAccumulateurMoyen:ac]);
    }

    - (id) initWithTotal:(int)aTotal 
    andAccumulateurMoyen:(AccumulateurMoyen *)aAcMoyen
    {
        if (self = [super init])
        {
            [aAcMoyen retain];
            [acMoyen release];
            acMoyen = aAcMoyen;
            total = aTotal;
        }
        return (self);
    }
@end

问题在于:if ((ac = [[AccumulateurMoyen alloc] init]) == nil) 当我重新定义init时,被调用的init是我的,而不是NSObject ... 我不知道如何正确地做到这一点(AccumulateurMoyenAccumulateur的子类)

你好

2 个答案:

答案 0 :(得分:1)

你可能在那里有不受欢迎的递归:[[AccumulateurMoyen alloc] init]尝试创建新的AccumulateurMoyen,但这会导致嵌套的initWithTotal:再次尝试创建另一个AccumulateurMoyen实例等。

即。您的代码尝试创建Accumulateur,其成员acMoyen设置为AccumulateurMoyen的新实例,其acMoyen又设置为AccumulateurMoyen的另一个新实例等

你必须打破无休止的递归。例如。在initWithTotal:中,替换

if ((ac = [[AccumulateurMoyen alloc] init]) == nil)

if ((ac = [[AccumulateurMoyen alloc] initWithTotal:0 andAccumulateurMoyen:nil]) == nil)

即。嵌套的AccumulateurMoyen将其成员设置为nil

答案 1 :(得分:0)

很抱歉,但我认为你的结构存在问题。为什么你的超类需要引用一个扩展它的类?我认为你最好的选择是再考虑一下你的班级结构。

但是在你的subClass中你可以改变init方法,这样你的问题就会消失。

(id)init {
    return ([NSObject init]);
}