美文网首页
@synthesize的妙用

@synthesize的妙用

作者: 东了个尼 | 来源:发表于2017-08-11 16:38 被阅读0次

    前两天和同事讨论在模型(model)中同时重写set get方法,结果编译器显示
    Use of undeclared identifier '_name';did you mean 'name'。的错误问题,由于平时很少同时书写set 和get 方法所以往往大家容易忽视这个问题。但是有的时候是需要同时重写set get 方法,所以觉得有必要说明下这个问题。

    首先介绍下@property和@synthesize
    @Property是声明属性的语法,它可以快速方便的为实例变量创建存取器,并允许我们通过点语法使用存取器。

    从Xcode4.4以后@property已经独揽了@synthesize的功能主要有三个作用:
    (1)生成了成员变量get/set方法的声明
    (2)生成了私有的带下划线的的成员变量因此子类不可以直接访问,但是可以通过. get/set方法访问。那么如果想让定义的成员变量让子类直接访问那么只能在.h文件. 中. 定义成员变量了,因为它默认是@protected
    (3)生成了get/set方法的实现

    注意:
    如果已经手动实现了get和set方法的话Xcode不会再自动生成带有下划线的私有成 员变量了
    因为xCode自动生成成员变量的目的就是为了根据成员变量而生成get/set方法的
    但是如果get和set方法缺一个的话都会生成带下划线的变量

    在Xcode4.4版本之前@property和@synthesize的功能是独立分工的:
    @property的作用是:自动的生成成员变量set/get方法的声明如代码:
    @property int age; 它的作用和下面两行代码的作用一致

    • (void)setAge:(int)age;
    • (int)age;
      注意:属性名称不要加前缀_ 否则生成的get/set方法中也会有下划线

    @synthesize的作用是实现@property定义的方法代码如:
    @synthesize age
    将@property中定义的属性自动生成get/set的实现方法而且默认访问成员变量age
    如果指定访问成员变量_age的话代码如:
    @synthesize age = _age;意思是:
    把@property中声明的age成员变量生成get/set实现方法,并且在实现方法内部
    访问_age这个成员变量,也就意味着给成员 _age 赋值
    注意:访问成员变量 _age 如果在.h文件中没有定义_age成员变量的话,就会在.m文件中自动生成@private类型的成员变量_age

    用@property声明的成员属性,相当于自动生成了setter getter方法,如果重写了set和get方法,与@property声明的成员属性就不是一个成员属性了,是另外一个实例变量,而这个实例变量需要手动声明。如果没有使用@synthesize age = _age就会报错误。

    文章中举例的demo

    相关文章

      网友评论

          本文标题:@synthesize的妙用

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