———-android培训、Java培训、iOS培训,期待与您交流———-
一、生成和set/get方法
1. 使用方法
@property 变量类型 (去掉下划线的)实例变量名//声明set和get方法
@synthesize 实例变量名//实现set和get方法
例:
@interface Person:NSObject
@property int age,weight;
@end
@implementation
@synthesize age,weight;
@end
上述代码相当于按照传统方式实现了set和get方法,可以用传统的中括号调用set/get方法,也可以直接用点操作符赋值和调用。
Person *p = [Person new];
p.age = 10;//相当于[p setAge:10]
p.weight = 50;//相当于[p setWeight:50]
NSLog(@"%d,%d",p.age,p.weight);//相当于[p age],[p weight]
2. 详解
@property和@synthesize是Xcode的编译器特性,前者会自动生成set和get方法的声明,后者会自动生成set和get方法的实现。例如,有一个成员变量num,@property int num;相当于自动生成了如下代码:
(void)setNum:(int)num;
(int)Num;
@synthesize num;相当于实现了如下代码:
(void)setNum:(int)num{
class->num = num;
}
(int)Num{
return num;
}
3.注意
通常手动定义成员变量时会加下划线,例如:int _age;但是如上使用@property和@synthesize时,生成的成员变量并不是加“_”的num,而是num。
二、为已定义的成员变量生成get/set方法
1. 使用方法
如果已经设置了成员变量int _age;设置set/get方法如下:
@property int age;
@synthesize age = _age;
2.详解
上述方法实现了为已经设定的成员变量设置set和get方法,而@synthesize = _age;实际上是产生了如下效果:
(void)setAge:(int)age{
_age = age;
}
(int)age{
age = _age;
return age;
}
三、增强用法(@property)
1.使用方法
在Xcode4.4版本之后可以只在@interface中声明@property而省略@implementation中的@synthesize。并且这样产生的set\get方法操作对象变成了带下划线的成员变量(如果当前没有声明该变量,则自动生成)。例如:
@interface MyClass:NSObject
@property int num;
-(void)test;
@end
@implementation MyClass
-(void)test{
NSLog(@"%d",_num);//打印成员变量_num
}
@end
注意:生成的变量是私有变量,既不能被子类继承也不能被子类使用。同时应该注意的是,用这种方法生成的变量是带下划线的,但是在为变量赋值和调用时,使用点语法或者中括号时,仍然应该使用不带下划线的方法名,例如继承上例,在main.m中:
MyClass *m = [MyClass new];
m.num = 10;
[m test];//输出10
2.重写
在对set/get方法有特殊需要时,可以手动重写set/get方法。在上例的基础上如下:
@implementation MyClass
-(void)setNum:(int)num{
//使得num值只能大于等于0,当为num赋值小于0的值时,自动为num赋值为0
if(num<0){
_num = 0;
}else{
_num = num;
}
}
@end
由此可以看出,@property命令实际上是让编译器自动实现了-(void)setNum:(int)num;方法。
注意:可以手动实现get或set方法,但是只能实现一个,不能同时重写两个方法。如果要重写两个方法,也就没有必要使用@property了。
四、@property的参数
格式:@property (参数1,参数2) 数据类型 方法名
参数类别 | 参数 | 说明 |
---|---|---|
原子性 | atomic | 对属性加锁,多线程下安全,默认值 |
/ | nonatomic | 对属性不加锁,多线程下不安全,但速度快 |
读写属性 | readwrite | 生成setter,getter,默认值 |
/ | readonly | 只生成getter |
set方法的属性 | assign | 直接赋值,默认 |
/ | retain | 先release原来的值,再retain新值 |
/ | copy | 先release原来的值,再copy新值 |
例:
@property (atomic,retain) (Car *) newCar;