@property

作者: 越天高 | 来源:发表于2019-02-21 08:39 被阅读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编写步骤
  1. 在@inteface和@end之间写上@property
  2. 在@property后面写上需要生成getter/setter方法声明的属性名称, 注意因为getter/setter方法名称中得属性不需要_, 所以@property后的属性也不需要_。并且@property和属性名称之间要用空格隔开
  3. 在@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方法,编译器就不会自动生成不 存在的成员变量

相关文章

网友评论

    本文标题:@property

    本文链接:https://www.haomeiwen.com/subject/ewnkyqtx.html