黑马程序员_@property 和 @synthesize (编译器特性)
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
int _age;
int _height;
double _weight;
NSString * _name;
}
// @property: 可以自动生成某个成员变量的setter和getter声明
@property int age; // 怎么写怎么生成
/*
- (void)setAge:(int)age;
- (int)age;
*/
@property int height;
/*
- (void)setHeight:(int)height;
- (int)height;
*/
@property double weight;
@property NSString * name;
@end
@implementation Person
@synthesize weight = _weight, name = _name;
// @synthesize自动生成age的setter和getter实现,并且会访问_age这个成员变量
@synthesize age = _age;
/*
- (void)setAge:(int)age
{
_age = age;
}
- (int)age
{
return _age;
}
*/
@synthesize height = _height;
/*
- (void)setHeight:(int)height
{
_height = height;
}
- (int)height
{
return _height;
}
*/
@end
int main()
{
Person *p = [Person new];
[p setAge:10];
return 0;
}
二、黑马程序员_@property和@synthesize最简写法
#import <Foundation/Foundation.h>
/*********** Car *************/
@interface Car : NSObject
{
// int _speed;
// int _wheels;
}
@property int speed;
@property int wheels;
//@property int speed, wheels;
@end
@implementation Car
// @synthesize speed = _speed, wheels = _wheels;
// 会访问_speed这个成员变量,如果不存在,就会自动生成@private类型的_speed变量(因为在@implementation中生成)
@synthesize speed = _speed;
@synthesize wheels = _wheels;
@end
/*********** Dog *************/
@interface Dog : NSObject
@property int age; // 变量是@private的
@end
@implementation Dog
@end
/************ main ************/
int main()
{
Dog *d = [Dog new];
d.age = 5;
NSLog (@"%d", d.age);
Car *c = [Car new];
c.speed = 100;
NSLog (@"%d", c.speed);
return 0;
}
三、黑马程序员_@property和@synthesize使用细节
1.@synthesize age = _age;
* setter 和 getter 实现中会访问成员变量_age;
* 如果成员变量_age不存在,就会自动生成一个@private的成员变量_age;
2.@synthesize age;
* setter 和 getter 实现中会访问成员变量age
* 如果成员变量age不存在,就会自动生成一个@private的成员变量age
3.手动实现
* 若手动实现了setter方法,编译器就只会自动生成getter方法
* 若手动实现了getter方法,编译器就只会自动生成setter方法
* 若同时手动实现了setter和getter方法,编译器就不会自动生成不存在的成员变量
#import <Foundation/Foundation.h>
@interface Cat : NSObject
@property int age; // @private类型的_age变量
@end
@implementation Cat
// 默认会访问age这个成员变量,如果没有age,就会自动生成@private类型的age变量
@synthesize age;
@synthesize age = _age;
@end
int main()
{
Cat *c = [Cat new];
c.age = 10;
NSLog (@"%d", c.age);
return 0;
}