美文网首页
synthesize关键字的作用

synthesize关键字的作用

作者: 一双鱼jn | 来源:发表于2018-07-03 10:47 被阅读3次

    通常我们习惯于如下方式定义一个属性,并通过点语法来调用属性的gettersetter方法。有时当重写gettersetter方法时还会使用带下划线的同名实例变量_str。那么,gettersetter以及这个实例变量是哪里来的。

    @property (nonatomic, strong) NSString *str
    

    iOS6之后 llvm编译器引入property autosysthesis 属性自动合成。

    也就是说property定义的属性会自动添加这样一行代码 @synthesize propertyName = _propertyName

    这也就是为什么property属性可以用带下划线的属性

    @synthesize propertyName = _propertyName
    这行代码的作用是

    1. propertyName这个属性生成gettersetter方法。
    2. 同时生成一个带下划线前缀的实例变量。或者说给propertyName添加一个别名

    什么时候会用到synthesize

    当下面这些情况的时候,系统不会自动的进行属性合成。也就是不会自动的生成gettersetter方法也不会自动的生成带_的实例变量。而我们需要使用实例变量和相关方法的时候,就需要手动添加synthesize来合成实例变量。

    1. 同时重写getter和setter方法时,不会自动合成属性。当我们只重写其中一个的时候还是会进行属性自动合成的
    2. 重写了只读属性的getter方法时。即表示当重写了readonly属性的getter方法时,带_的实例变量需要我们手动通过synthesize来合成。
    3. 使用了@dynamic
    4. 协议中的属性
    5. category中的属性
    6. 重载的属性

    下面来分别说明

    协议中的属性

    协议中定义了属性,协议中定义了属性其实也就是定义了该属性的getter和setter方法,但是并没有该方法的实现。

    所以在遵守该协议的类中应该实现对应的getter和setter方法。可以直接通过synthesize关键字来自动生成。

    @dynamic

    property会自动的添加synthesize,而synthesize的作用是自动生成getter和setter,并且定义一个带下划线的实例变量

    dynamic关键字则会阻止自动生成getter和setter方法和生成变量

    @interface model
    @property (nonatomic, strong) NSString *str;
    @end
    
    @implementation
    @dynamic str;
    @end
    

    相关文章

      网友评论

          本文标题:synthesize关键字的作用

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