调用函数陷入递归循环并且永远不会出现
Invoking function getting stuck in a recursive loop and never comes
我正在学习 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;
}
您遇到的问题是由为速度创建 属性 引起的:
@property float speed;
并覆盖 setSpeed:
方法。
当您创建@属性 时,编译器会为您添加两个方法,在您的示例中为setSpeed 和speed。
这个命令:
self.speed = speed;
等于:
[self setSpeed: speed];
在 setSpeed 中,您再次使用此命令导致循环。在您的示例中,您可以删除这两种方法(setSpeed 和 speed),因为编译器会为您添加它。如果你需要它是因为你想做一些定制,你应该使用 _speed 而不是 self.speed。
_speed 是编译器在使用@属性 时添加的支持变量。
将您的方法更改为:
-(void) setSpeed:(float)speed {
_speed = speed;
}
删除无限循环。
在
- (NSString*)make;
使用
return _make
相反。速度也一样。
如果您在 getter 方法中 return "self.x",那么它将尝试再次调用该方法,因为您是在自己请求它。 XCode 会自动将属性转换为可以使用 '_' 字符访问的变量,因此您不需要做任何额外的工作。
您也可以忽略我们的建议并删除您创建的 "speed" 和 "make" getter 方法,因为 XCode 会自动为您创建它们。
我正在学习 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;
}
您遇到的问题是由为速度创建 属性 引起的:
@property float speed;
并覆盖 setSpeed:
方法。
当您创建@属性 时,编译器会为您添加两个方法,在您的示例中为setSpeed 和speed。 这个命令:
self.speed = speed;
等于:
[self setSpeed: speed];
在 setSpeed 中,您再次使用此命令导致循环。在您的示例中,您可以删除这两种方法(setSpeed 和 speed),因为编译器会为您添加它。如果你需要它是因为你想做一些定制,你应该使用 _speed 而不是 self.speed。 _speed 是编译器在使用@属性 时添加的支持变量。 将您的方法更改为:
-(void) setSpeed:(float)speed {
_speed = speed;
}
删除无限循环。
在
- (NSString*)make;
使用
return _make
相反。速度也一样。
如果您在 getter 方法中 return "self.x",那么它将尝试再次调用该方法,因为您是在自己请求它。 XCode 会自动将属性转换为可以使用 '_' 字符访问的变量,因此您不需要做任何额外的工作。
您也可以忽略我们的建议并删除您创建的 "speed" 和 "make" getter 方法,因为 XCode 会自动为您创建它们。