1、@property int age;
在编译器情况下会自动编译展开为:
<age在setter中首字母大写,点语法为p.age>
- (void)setAge:(int)age;
- (int)age;
2、同理:@property int _age;
在编译器情况下会自动编译展开为:
<_age在setter中首字母大写,为横线,大写仍保持,此时点语法为p._age>
- (void)set_age:(int)age;
- (int)_age;
一般情况,使用1,而不使用2.
@synthesize age = _age;
会访问_age这个成员变量,如果_age成员变量不存在,系统就会自动生成@private类型的_age的成员变量,并自动生成age的setter与getter
在4.5版本之后,可以省略@synthesize,此时,
@property int age;有三个作用
1、生成setter与getter的声明
2、生成_age的成员变量
3、生成setter与getter的实现
//注意:必须在非ARC下,在“项目——》building setting——》all——》objcet-C Automic Reference Counting
//@property(nonatomic,retain) NSString *name相当于:
- (void)setName:(NSString *)name
{
if (_name != name)
{
[_name release];
_name = [name retain];
}
}
否则,无法操作 [_name release];
_name = [name retain];
_name = [name retain];
// @property:可以自动生成某个成员变量的setter和getter声明
@property int age;
//- (void)setAge:(int)age;
//- (int)age;
@property int height;
//- (void)setHeight:(int)height;
//- (int)height;
可以简写为:@property int age, height;
注意:生成的是age、height而不是_age、_height成员变量
语义设置(assign、retain、copy)
基本数据类型用assign;NSString用copy、(retain也可以使用);非NSString对象用过retain
例:
@property(nonatomic,assign)int age;
@property(nonatomic,copy)NSString *name;
@property(nonatomic,copy)NSString *name;
@property(nonatomic,retain)NSString *number;
@property(nonatomic,retain)NSArray *group;
@property(nonatomic,retain)NSArray *group;
@synthesize age = _age;
// @synthesize自动生成age的setter和getter实现,并且会访问_age这个成员变量,4.4后自动生成。
#import <Foundation/Foundation.h>
@interface Car : NSObject
{
//int _speed;
//int _wheels;
}
@property int speed;
@property int wheels;
//@property int speed, wheels;
- (void)test;
@end
{
//int _speed;
//int _wheels;
}
@property int speed;
@property int wheels;
//@property int speed, wheels;
- (void)test;
@end
#import "Car.h"
@implementation Car
//@synthesize speed = _speed, wheels = _wheels;
// 注意:会访问_speed这个成员变量,如果不存在,就会自动生成@private类型的_speed变量
@synthesize speed = _speed;
@synthesize wheels = _wheels;
- (void)test
{
NSLog(@"速度=%d", _speed);
}
@end
@implementation Car
//@synthesize speed = _speed, wheels = _wheels;
// 注意:会访问_speed这个成员变量,如果不存在,就会自动生成@private类型的_speed变量
@synthesize speed = _speed;
@synthesize wheels = _wheels;
- (void)test
{
NSLog(@"速度=%d", _speed);
}
@end
同理:
@synthesize age;
// 默认会访问age这个成员变量,如果没有age,就会自动生成@private类型的age变量
@property int age;
如果.m中有setter或getter,系统会生成成员变量以及getter或setter。若既存在setter又存在getter,则不再会产生getter、setter以及成员变量,因为成员变量是为setter与getter服务的。此时(三无),@synthesize age = _age;无法省略。
id等价于NSObject*,万能指针,能指向或操作任何OC对象