Objective c 调用函数陷入递归循环,永远不会出现

Objective c 调用函数陷入递归循环,永远不会出现,objective-c,recursion,Objective C,Recursion,我正在学习Objective-C继承,我的程序在一个递归循环中迷失了方向,不会出现。它在调用getter函数时挂起 我使用的是XCode版本:版本6.2(6C101) 我的程序如下 车辆.h #ifndef exercise_2_Vehicle_h #define exercise_2_Vehicle_h #import <Foundation/Foundation.h> @interface Vehicle : NSObject @property float speed;

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

我使用的是XCode版本:版本6.2(6C101)

我的程序如下

车辆.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
汽车

汽车

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;
}
#导入
#进口“Car.h”
#进口“Vehicle.h”
int main(int argc,const char*argv[]{
@自动释放池{
//在这里插入代码。。。

汽车*Car=[[Car alloc]init]initMake:@“凯美瑞”]; //[汽车设定速度:45]; NSLog(@“模型已初始化”); [汽车制造]; //[车速]; } 返回0; }
您遇到的问题是由创建速度属性引起的:

@property float speed;
并重写
setSpeed:
方法

当您创建@property时,编译器会为您添加两个方法,在您的示例中是setSpeed和speed。 此命令:

self.speed = speed;
等于:

[self setSpeed: speed];
在setSpeed中,你又有了这个命令,它导致了循环。在您的示例中,您可以删除这两个方法(setSpeed和speed),因为编译器将为您添加它。如果你需要它,因为你想做一些定制,你应该使用_speed而不是self.speed。 _速度是编译器在使用@property时添加的变量。 将您的方法更改为:

-(void) setSpeed:(float)speed {
    _speed = speed;
}
删除无限循环。

中的

- (NSString*)make;
使用

相反。速度也一样

如果在getter方法中返回“self.x”,那么它将再次尝试调用该方法,因为您是在self上请求它的。XCode将自动将属性转换为变量,这些变量可以用“\ux”字符访问,因此您不需要做任何额外的工作


您也可以忽略我们的建议,删除您所使用的“speed”和“make”getter方法,因为XCode会自动为您创建它们。

Car*Car=[[Car alloc]init]initMake:@“Camry”];将此更改为Car*Car=[[Car alloc]initMake:@“Camry”];尝试this@Spynet非常感谢。我想知道我做错了什么。嗨,乔伊,我有个问题。在Objective-C land中“ux”是如何表示的?“_make”表示什么?当你使用@property时,你并没有真正创建任何东西。编译器将读取这些数据并将其转换为“实例变量”。它还将为实例变量创建“getter”和“setter”。当您执行“self.myVariable”时,实际上是在调用生成的getter。如果希望重写getter或setter,那么如果希望更改任何内容,则必须使用generate实例变量。在setter和getter之外,您可以使用“self.myVar=10”或其他方法更改实例变量,因为这只是调用setter。_u是一种访问实例变量的方法“u”在objective-c中如何工作?我刚刚开始阅读苹果的文档,对此我一无所知。
[self setSpeed: speed];
-(void) setSpeed:(float)speed {
    _speed = speed;
}
- (NSString*)make;
return _make