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あります。initNSObjectAccumulateurMoyenAccumulateur

ありがとうございます

4

2 に答える 2

1

そこにはおそらく望ましくない再帰があります。[[AccumulateurMoyen alloc] init]新しいものを作成しようとしますが、その結果、別のインスタンスなどを作成しようとするAccumulateurMoyen入れ子になります。initWithTotal:AccumulateurMoyen

つまり、あなたのコードは、の新しいインスタンスに設定されたAccumulateurメンバーを持つものを作成しようとし、これは再び別の新しいインスタンスなどに設定されます.acMoyenAccumulateurMoyenacMoyenAccumulateurMoyen

無限再帰を破る必要があります。例では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 に答える