我正在学习Objective-C继承,我的程序在递归循环中迷失了,并且不会出现。它在调用getter函数时会挂起。
我正在使用XCode版本:版本6.2(6C101)
我的计划如下:
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;
}
答案 0 :(得分:1)
您遇到的问题是由为速度创建属性引起的:
@property float speed;
并覆盖setSpeed:
方法。
当您创建@property编译器时,为您添加两种方法,在您的示例中为setSpeed和speed。 这个命令:
self.speed = speed;
等于:
[self setSpeed: speed];
并在setSpeed内部再次使用此命令导致循环。在您的示例中,您可以删除这两种方法(setSpeed和speed),因为编译器会为您添加它。如果你需要它,因为你想做一些自定义,你应该使用_speed而不是self.speed。 _speed是使用@property时由编译器添加的支持变量。 将您的方法更改为:
-(void) setSpeed:(float)speed {
_speed = speed;
}
删除无限循环。
答案 1 :(得分:1)
在
中- (NSString*)make;
使用
return _make
代替。与速度相同。
如果你返回&#34; self.x&#34;在getter方法中,然后它会尝试再次调用该方法,因为您自己要求它。 XCode会自动将属性转换为可以通过&#39; _&#39;来访问的变量。性格,所以你不需要做任何额外的工作。
你也可以忽略我们的建议并删除&#34;速度&#34;和&#34;制作&#34;你已经制定了getter方法,因为XCode会自动为你创建它们。