黑马程序员——@property和@synthesize

———-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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值