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

时间:2015-01-28 10:04:45

标签: objective-c recursion

我正在学习Objective-C继承,我的程序在递归循环中迷失了,并且不会出现。它在调用getter函数时会挂起。

我正在使用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;
}

2 个答案:

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