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)