Objective c 调用函数陷入递归循环,永远不会出现
我正在学习Objective-C继承,我的程序在一个递归循环中迷失了方向,不会出现。它在调用getter函数时挂起 我使用的是XCode版本:版本6.2(6C101) 我的程序如下 车辆.hObjective 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;
#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