@property
2019-02-21 本文已影响13人
越天高
1.什么是@property
-
@property是编译器的指令
什么是编译器的指令 ? -
编译器指令就是用来告诉编译器要做什么!
@property会让编译器做什么呢?
在Xocde4.4之前, 可以使用@porperty来代替getter/setter方法的声明
也就是说我们只需要写上@porperty就不用写getter/setter方法的声明
编译器只要看到@property, 就知道我们要生成某一个属性的getter/setter方法的声明 -
@property 用在声明文件中告诉编译器声明成员变量的的访问器(getter/setter)方法
这样的好处是:免去我们手工书写getter和setter方法繁琐的代码
2.@property基本使用
在@inteface中,用来自动生成setter和getter的声明
用@property int age;就可以代替下面的两行
- (int)age; // getter
- (void)setAge:(int)age; // setter
- @property编写步骤
- 在@inteface和@end之间写上@property
- 在@property后面写上需要生成getter/setter方法声明的属性名称, 注意因为getter/setter方法名称中得属性不需要_, 所以@property后的属性也不需要_。并且@property和属性名称之间要用空格隔开
- 在@property和属性名字之间告诉需要生成的属性的数据类型, 注意两边都需要加上空格隔开
@property增强
-
自从Xcode 4.x后,@property可以同时生成setter和getter的声明和实现
-
没有告诉@property要将传入的参数赋值给谁, 默认@property会将传入的属性赋值给_开头的成员变量
-
@property有一个弊端: 它只会生成最简单的getter/setter方法的声明和实现, 并不会对传入的数据进行过滤
如果想对传入的数据进行过滤, 那么我们就必须重写getter/setter方法 -
如果不想对传入的数据进行过滤, 仅仅是提供一个方法给外界操作成员变量, 那么就可以使用@property
-
如果利用@property来生成getter/setter方法, 那么我们可以不写成员变量, 系统会自动给我们生成一个_开头的成员变量
-
注意: @property自动帮我们生成的成员变量是一个私有的成员变量, 也就是说是在.m文件中生成的, 而不是在.h文件中生成的
@interface Person : NSObject
{
int _age;
}
@property int age;
@end
2.@property增强注意点
- 默认情况下,setter和getter方法中的实现,会去访问下划线 _ 开头的成员变量。
@interface Person : NSObject
{
@public
int _age;
int age;
}
@property int age;
@end
int main(int argc, const char * argv[]) {
Person *p = [Person new];
[p setAge:30];
NSLog(@"age = %i, _age = %i", p->age, p->_age);
return 0;
}
- 如果没有会自动生成一个_开头的成员变量,自动生成的成员变量是私有变量, 声明在.m中,在其它文件中无法查看,但当可以在本类中查看
- @property只会生成最简单的getter/setter方法,而不会进行数据判断
Person *p = [Person new];
[p setAge:-10];
NSLog(@"age = %i", [p age]);
- 如果需要对数据进行判断需要我们之间重写getter/setter方法
- 若手动实现了setter方法,编译器就只会自动生成getter方法
- 若手动实现了getter方法,编译器就只会自动生成setter方法
- 若同时手动实现了setter和getter方法,编译器就不会自动生成不 存在的成员变量