0

这是代码:

@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......我不知道,我怎么能正确地做到这一点(AccumulateurMoyen是子类Accumulateur

谢谢你

4

2 回答 2

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.

于 2012-06-18T12:40:34.043 回答
0

抱歉,但我认为您在这里遇到了结构性问题。为什么你的超类需要引用扩展它的类?我认为你最好的选择是再想想你的班级结构将如何。

但是在您的子类中,您可以将 init 方法更改为,这样您的问题就会消失。

(id)init {
    return ([NSObject init]);
}
于 2012-06-18T12:17:15.703 回答