Objective c Init和带有参数的Init

Objective c Init和带有参数的Init,objective-c,class,initialization,Objective C,Class,Initialization,代码如下: @implementation Accumulateur // Constructor - (id) init { return ([self initWithTotal:0]); } - (id) initWithTotal:(int)aTotal { AccumulateurMoyen *ac; if ((ac = [[AccumulateurMoyen alloc] ini

代码如下:

@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=[[acgregateEurmoyen alloc]init])==nil)
正如我重新定义的
init
,调用的
init
是我的,而不是
NSObject
。。。 我不知道如何才能正确地做到这一点(
AccumerateUrmoyen
AccumerateUr
的子类)


谢谢你

对不起,我想你这里有一个结构性问题。为什么您的超类需要有一个对扩展它的类的引用?我认为你最好的选择是再考虑一下你的班级结构

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

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

您可能有不需要的递归:
[[acgregateUrmoyen alloc]init]
尝试创建新的
acgregateUrmoyen
,但这会导致嵌套的
initWithTotal:
再次尝试创建另一个
acgregateUrmoyen
实例等

也就是说,您的代码尝试创建
acumerateUr
,其成员
acMoyen
设置为
acumerateUrmoyen
的新实例,其
acMoyen
再次设置为
acumerateUrmoyen
的另一个新实例

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

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


也就是说,嵌套的
acgregateUrmoyen
将其成员设置为
nil

,因为Accumuluteur有一个实例变量类型为acgregateUrmoyen:/所以您的所有acgregateUrmoyen都需要有一个对一个acgregateUrmoyen的引用,该acgregateUrmoyen将有一个对其他acgregateUrmoyen的引用?不,不可能是那样的:嗯。。不,你有什么想法吗p可能您需要一个用于AccumerateUrmoyen和AccumerateUr的通用超类,该类实现您希望它们共享的方法,这样您的AccumerateUrmoyen只能有一个AccumerateUrmoyen,并消除循环。告诉你只有更多地了解你的问题才是最好的方法,这只是一个建议。好吧,我有一个很大的结构性问题,因为我混淆了组合和继承。“为什么您的超类需要有对扩展它的类的引用?”。谢谢你:)
if ((ac = [[AccumulateurMoyen alloc] initWithTotal:0 andAccumulateurMoyen:nil]) == nil)