黑马程序员--OC之@property的使用

黑马程序员--OC之@property的使用

------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------
1、传统的get和set方法
定义一个Student类,拥有一个成员变量age和对应的getset方法。
Student类:
@interfaceStudent : NSObject{
int_age;
}
-(void)setAge:(int)newAge;//setter方法
-(int)age;//getter方法
@end
Student类实现:
@implementationStudent
//setter方法实现
-(void)setAge:(int)newAge{
_age= newAge;
}
//getter方法
-(int)age{
return_age;
}
@end
调用:
Student*stu = [[Studentalloc] init];
// 设置age的值
[stu setAge:10];
// 取出age的值
intage = [stu age];
NSLog(@"age is %i", age);
打印结果:age is 10
2、点语法介绍和使用
    1)使用“点语法”
    Student*stu = [[Studentalloc] init];
    // 设置age的值
    stu.age= 10; // 等价于[stu setAge:10];
    // 取出age的值
    intage = stu.age; // 等价于int age = [stu age];
    NSLog(@"age is %i", age);
    注意:
    1)把原来的[stu setAge:10]替换成了stu.age = 10。这两种写法是完全等价的。即这里的stu.age并不是代表直接访问stu对象的成员变量age,而是编译器遇到stu.age = 10的时候会自动将代码展开成[stu setAge:10]
    2)把原来的int age = [stu age]替换成了int age = stu.age。这两种写法又是完全等价的,stu.age并不是直接访问stu对象的成员变量age,而是编译器遇到int age = stu.age的时候会自动将代码展开成int age = [stu age]
    3)OC点语法的本质是方法调用,不是直接访问成员变量。至于这个点语法代表的是get方法还是set方法,那就取决于你是取值还是设值(也可以理解为点语法是在“=”的左侧还是右侧,左侧:如 stu.age=…. 这就是调用set方法,右侧 … = stu.age 这就是调用get方法),取值就是get方法,设值就是
set方法
     2)点语法陷阱
    1)OC中有个self关键字,作用跟this关键字类似。
-(void)setAge:(int)newAge {
self.age= newAge;
}
这中写法是错误的,会造成死循环。OC点语法的本质是方法调用,所以上面的代码相当于
-(void)setAge:(int)newAge {
[selfsetAge:newAge];
}
下面的使用方式也是一个死循环:在get方法中,return self.age;相当于是[self age];
点语法的本质是方法的调用,而不是访问成员变量,当使用点语法时,编
译器会自动展开成相应的方法。切记点语法的本质是转换成相应的set和get方法,如果没有set和get方法,则不能使用点语法。
3、@property关键字介绍及使用
    1)基本概念
@property是编译器的指令
什么是编译器的指令,编译器指令就是用来告诉编译器要做什么
@property 告诉编译器声明属性的访问器(getter/setter)方法
这样的好处是:免去我们手工书写get和set方法繁琐的代码
    2)@property用法
@property 类型 方法名
如:@property int age;
相当于进行了age的set和get方法的声明
-(void)setAge:(int)age;
-(int)age;
    3)@property使用注意事项
在老式的代码中,
@property只能写在@interface @end中,
@property 用来自动生成成员变量的get/set方法声明(xcode4.4以前)
告诉property要生成的get/set方法声明的成员变量类型是什么
告诉property要生成的get/set方法是哪个属性的,属性名称去掉下划线
4、@synthesize关键字介绍和使用
    1)@synthesize用法
@synthesize是在m文件中定义set和get方法的实现。
    2)@property int age; @synthesize age; 表示生成.h中变量age的get和set方法
注意;
    3)如果@synthesize 变量名要先在.h文件中声明
@property int age; @synthesize age;展开形式如下:
.h文件
-(void)setAge:(int)age;
-(int)age;
.m文件
-(void)setAge:(int)age{
slef->age = age;
}
-(int)age{
returnage;
}
    4)错误用法,只写了@synthesize,没有写@property ,也没有定义变


NSString *name;
@property 类型xxx 如果类中没有xxx这个实例变量,则会自动生成一个。
    5)注意事项
 @property和@synthesize搭配使用,用于简化set和get方法的定义和实现
    6)@synthesize指定实例变量赋值
    7)@property int a; @synthesize a = _b; 表示用a的get和set方法,修改属性b的值
相当于下面的代码:
-(void)setA:(int)a
_b=a;
{
}
-(int)a
return_b;
{
}
5、@property增强使用
    1)@property增强使用
Xcode4.4版本以后支持的
只使用@property 进行声明,类自动帮你实现。
xcode4.4以后property做了增强
帮助我们自动生成get/set方法的声明
帮助我们自动生成get/set方法的实现
如果没有手动声明成员变量,perperty会在.m文件中自动帮我们生成一个_开头的成员变量
    2)注意点:如果想让子类继承父类的成员变量,还是必须在.h中手动写成员变量
.h文件中
@property int score;
.m文件中
首先生成一个_score的变量 (注意该变量是私有的)
-(void)setScore:(int) score{
_score = score;
}
-(int)score{
return _score;
}
6、@property增强下重写get和set方法
    1)@property下重写get和set方法
手动实现:
    2)如果手动实现了set方法,那么编译器就只生成get方法和成员变量;
    3)如果手动实现了get方法,那么编译器就只生成set方法和成员变量;
    4)如果set和get方法都是手动实现的,那么编译器将不会生成成员变量,并且报错。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值