黑马程序员--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)注意事项
定义一个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方法都是手动实现的,那么编译器将不会生成成员变量,并且报错。
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方法都是手动实现的,那么编译器将不会生成成员变量,并且报错。