调用函数陷入递归循环并且永远不会出现

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 会自动为您创建它们。