2015-01-28 2 views
0

Я изучаю Наследование Objective-C, и моя программа теряется в рекурсивном цикле и не выйдет. Он зависает при вызове функции геттера.Вызов функции застревание в рекурсивном цикле и никогда не приходит

Я использую XCode версии: Версия 6.2 (6C101)

XCode Recursive loop

Моя программа приведена ниже

Vehicle.h

#ifndef exercise_2_Vehicle_h 
#define exercise_2_Vehicle_h 
#import <Foundation/Foundation.h> 

@interface Vehicle : NSObject 

@property float speed; 


    -(void) start; 

    -(void) stop; 

    -(void) park; 

@end 

#endif 

Vehicle.m

#import "Vehicle.h" 

@implementation Vehicle 

-(void) setSpeed:(float)speed { 
    self.speed = speed; 
} 

-(float) speed { 
    return self.speed; 
} 

-(void) start { 
    NSLog(@"Starting the vehicle"); 
} 

-(void) stop { 
    NSLog(@"Stopping the vehicle"); 
} 

-(void) park { 
    NSLog(@"Parking the vehicle"); 
} 


@end 

Car.h

#ifndef exercise_2_Car_h 
#define exercise_2_Car_h 

#import "Vehicle.h" 
@interface Car : Vehicle 
@property (nonatomic) NSString* make; 


-(Car*) initMake: (NSString*) make; 

-(NSString*) make; 


@end 
#endif 

Car.m

#import "Car.h" 

@implementation Car 


-(Car*) initMake:(NSString *)make { 
    self = [super init]; 
    if (self) { 
     self.make = make; 
    } 
    return self; 
} 

-(NSString*) make { 
    return self.make; 
} 
@end 

main.m

#import <Foundation/Foundation.h> 

#import "Car.h" 
#import "Vehicle.h" 

int main(int argc, const char * argv[]) { 
    @autoreleasepool { 
     // insert code here... 
     Car* car = [[[Car alloc] init] initMake: @"Camry"]; 
     //[car setSpeed:45]; 
     NSLog(@"The model initialized is "); 
     [car make]; 
     // [car speed]; 

    } 
    return 0; 
} 
+1

Автомобиль * Автомобиль = [[[Автоприбор] init] initMake: @ "Camry"]; измените это на Car * car = [[Car alloc] initMake: @ «Camry»]; попробуйте это – Spynet

+0

@Spynet Спасибо. Мне было интересно, что я делаю неправильно. – Kartik

ответ

1

Проблема у вас есть вызвано созданием свойство для скорости:

@property float speed; 

и переопределение setSpeed: способ.

При создании компилятора @property добавляются два метода для вас, в вашем примере setSpeed ​​и скорость. Эта команда:

self.speed = speed; 

равно:

[self setSpeed: speed]; 

и внутри SetSpeed ​​вы имеете эту команду снова, которая вызывает петлю. В вашем примере вы можете удалить оба метода (setSpeed ​​и скорость), потому что компилятор добавит его для вас. Если вам это нужно, потому что вы хотите выполнить некоторую настройку, вы должны использовать _speed вместо self.speed. _speed - переменная, добавленная компилятором при использовании @property. Изменить метод:

-(void) setSpeed:(float)speed { 
    _speed = speed; 
} 

удалить бесконечный цикл.

+0

Как работает «_» в объективе-c? Я только что начал читать яблочные документы, и я не могу сделать голову или хвост. – Kartik

1

При использовании

- (NSString*)make; 

return _make 

вместо этого. То же самое со скоростью.

Если вы возвращаете «self.x» в методе геттера, то он попытается снова вызвать метод, потому что вы запрашиваете его самостоятельно. XCode автоматически преобразует свойства в переменные, к которым можно получить доступ с символом «_», поэтому вам не нужно выполнять какую-либо дополнительную работу.

Вы также можете проигнорировать наш совет и удалить оба метода «скорость» и «сделать» геттера, потому что XCode автоматически создает их для вас.

+0

Привет, Джо, у меня есть вопрос. Как означает «_» в земле Objective-C? Что означает «_make»? – Kartik

+0

Когда вы используете @property, вы действительно ничего не создаете. Компилятор прочитает это и преобразует их в «переменные экземпляра». Он также создаст «геттеры» и «сеттеры» для переменных экземпляра. Когда вы делаете «self.myVariable», вы на самом деле вызываете сгенерированный геттер. Если вы хотите переопределить getter или setter, вы должны использовать переменную экземпляра generate, если хотите что-либо изменить. Вне сеттеров и геттеров вы можете изменить переменную экземпляра, используя «self.myVar = 10» или что-то еще, потому что это просто вызывает сеттер. _ - способ доступа к переменной экземпляра –

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