2013-02-19 2 views
0

У меня есть квадрат класса я пытаюсь переопределить метод инициализации, то .m выглядит следующим образом:Получение ошибки, пытаясь переопределить метод Init

@implementation Square 

{ 
    Rectangle *rect; 
} 

@synthesize side; 

-(int) area 
{ 
    return side * side; 
} 

-(int) peremiter 
{ 
    return side * 4; 
} 

-(id) init 
{ 
    return [self init]; 
} 

-(Square *) initWithSide:(int)s 
{ 
    self = [super init]; 

    if (self) 
    [self initWithSide:s]; 

    return self; 
} 

@end 

И.М. Ошибка при получении находится в initWithSide Methode, что сказать :

результат делегата init должен быть немедленно возвращен или назначенным self

+0

зачем вы сделали рекурсивный вызов внутри метода '-initWithSide:'? что вы ожидаете от рекурсии? возвращаемое значение должно быть 'id', а не' Square' ... все остальное выглядит хорошо. – holex

+0

@holex это была моя ошибка, вместо того, чтобы писать там 'setSide' по ошибке, я написал' initWithSide' – JohnBigs

+0

как насчет типа возврата? – holex

ответ

2

Этих строк:

if (self) 
[self initWithSide:s]; 

Не имеет смысла, и в основном означает, что вы снова и снова будете называть инициализатор. Вы должны изменить его, чтобы сделать что-то полезное (например, установить значение s). С другой стороны, ваш метод no-arg init также неверен. Это должно быть:

-(id) init { 
    return [super init]; 
} 

Но, поскольку в нем нет специализированной реализации, на самом деле это вообще не нужно.

+0

ohh! теперь я получаю свою проблему ..:/thanks buddy. @Perception – JohnBigs

0

Это правильный синтаксис:

- (id) initWithSide:(int)s{ 
    self = [super init]; 
    if (self){ 
     //init elements 
    } 
    return self; 
} 
+0

@vikingosegundo могу ли я использовать этот метод для инициализации переменной 'rect'? – JohnBigs

+0

Не знаете, почему у меня спрашивают, а не Тито, но вы можете это сделать. – vikingosegundo

+0

запутался, потому что вы отредактировали ответ, поэтому я тоже вижу вашего пользователя @vikingosegundo – JohnBigs

1

упадите текущих инициализации методов и заменить их них (не забудьте обновить их в рамках интерфейса):

- (id)init { 
    if (self = [super init]) { 
     // do whatever you like to to do here 
    } 
    return self; 
} 

- (id)initWithSide:(int)s { // but an NSInteger would be more elegant, and the parameter name 's' also would be better to be like 'side' 
    if (self = [super init]) { 
     [self setSide:s]; 
    } 
    return self; 
}