问题描述
#import <Foundation/Foundation.h>@interface Person :NSObject{ int age; NSString * name;}-(void)setAge:(int)age;-(void) sayHi;@end@implementation Person-(void)setAge:(int)age{ self.age=age;}-(void)sayHi{ NSLog(@'im jerry %d',age);}@endint main(int argc, const char * argv[]) { @autoreleasepool { Person* p=[Person new]; [p setAge:5];[p sayHi]; } return 0;}
self.age=age;这里报错了。在java里面,不是this.age=age吗?oc里面难道不行吗?
问题解答
回答1:在objective-c里面,属性虽然调用的时候像是一个简单的赋值、取值操作,但是实际上它属性的使用是方法的调用!如:@property(copy) NSMutableArray *array;这个属性添加以后,用起来好像是一个变量,其实编译器做的不仅仅是添加了一个变量:
添加了一个类全局变量NSMutableArray * _array
添加了Get方法-(NSMutableArray *)array;
添加了Set方法-(void)setArray:(NSMutableArray *)array;
你的代码中虽然没有使用@property,指定属性,但是缺命名了一个符合属性的set方法的方法名,因此,使用时一样可以使用点语法。
Aself.age=age;B
[self setAge:age];
A、B两者是等效的!编译后,A会被转化成B的形式,而B会进一步转化成C函数调用的形式!
你在-setAge:方法里面调用-setAge:,导致无限递归。如果你有注意到崩溃时程序的栈,会发现栈里面都是-setAge:。
想要避免这个问题,就直接使用类变量赋值
_age = age;回答2:
详细解释如楼上所述,简而言之:OC中的点语法,只是一种编译器特性,本质仍然是方法调用。
回答3:这里不要用点语法,然后就是你的成员变量前都统一加上下划线来区分。 _age = age;
回答4:写在这里@interface可以直接用不用加self.直接age = age就行