@property和@synthesize关键字
1、@property和@synthesize 的作用
- @property 生成某个成员变量的setter和getter的声明
- @synthesize 生成某个成员变量的setter和getter的实现
2、@property和@synthesize 的用法
@property 的用法: @property (成员变量类型) 成员变量名没有下划线;
//.......成员变量_age的setter和getter方法的声明 @property int age; //........
@synthesize 的用法:@synthesize 对应property = 对应成员变量;
// ...成员变量_age的setter和getter方法的实现 @synthesize age = _age; // .......
3、@property和@synthesize 的注意点
- 使用@synthesize 时需注意等号后面对应成员变量,如果不写默认是不带下划线的成员变量
eg:
#import <Foundation/Foundation.h> @interface Person : NSObject { int _age; int age; } @property int age; // 对象方法输出年龄 - (void)test; @end @implementation Person @synthesize age; // 对象方法test 输出年龄 - (void)test { NSLog(@"_age=%d, age=%d", _age, age); } @end int main() { // 定义一个Person对象 Person *p = [Person new]; // 点语法 p.age = 100; // 调用对象方法test [p test]; return 0; } // 输出结果为:_age=0,age=100
- 只使用@property关键字就能实现成员变量的声明和实现
eg:
/* 定义一个Person类 成员变量:年龄,身高,姓名 */ @interface Person : NSObject // 只用@property @property int age; @property double height; @property NSString *name; @end @implementation Person @end int main() { Person *p = [Person new]; int personAge = p.age; return 0; }
- 使用@property 让编译器自动生成成员变量,成员变量的作用域为private
- 使用@property关键字,如果手动生成了setter方法和getter方法的声明和实现,就不会自动生成成员变量了;如果只是手动生成了setter和getter方法的声明或者实现中的其中一个,那么编译器依然会自动生成成员变量
eg:
#import <Foundation/Foundation.h> @interface Person : NSObject @property double height; // 手动声明了_height的setter和getter方法 - (void)setHeight:(double)height; - (double)height; // 对象方法输出身高 - (void)test; @end @implementation Person // 对象方法test 输出身高 - (void)test { // 输出_height 没有报错,_height 没有手动生成 NSLog(@" height=%f", _height); } @end int main() { // 定义一个Person对象 Person *p = [Person new]; // 点语法 p.height = 100; // 调用对象方法test [p test]; return 0; } // 输出结果为:height=100.000000