2012-06-18 2 views
0

Вот код:Init и инициализации с параметрами

@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)

Thx вам

ответ

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.

+0

Thx you very much: D – helock

0

Извините, но я т у вас есть структурная проблема. Почему ваш суперкласс должен иметь ссылку на класс, который его расширяет? Я думаю, что ваш лучший вариант - это снова подумать, как будет выглядеть ваша структура класса.

Но в вашем подклассе вы можете изменить метод init, чтобы ваша проблема исчезла.

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

Поскольку у Accumuluteur есть экземпляр переменного типа AccumulateurMoyen:/ – helock

+0

Итак, все ваши AccumulateurMoyen должны иметь ссылку на AccumulateurMoyen, который будет иметь ссылку на другой AccumulateurMoyen? Нет, это не может быть так: P – ggrana

+0

hmm .. no: s У вас есть идея? : p – helock

Смежные вопросы