美文网首页
iOS 关于@property

iOS 关于@property

作者: lixiaoshuai | 来源:发表于2018-12-20 14:56 被阅读8次

    关于 @property

    1. property的本质
      类的属性,用于存储数据

    2. 实现方式
      生成 ivar(实例变量) + access method (存取方法 set,get)

    小结:关于自动合成: @property 通过 auto synthesis (自动合成,编译过程中)生成了实例变量 以及存取方法, 实例变量名 _var , 存取方法名称 setVar:(set) var (get)。
    此命名规则为固定的,在自定义方法名称时,要符合该命名规范。

    1. 属性的实现干预
      除了自动生成,可以通过 @systhesis 和 @dynamic 自定义属性的实现。
      @systhesis 可以自定义生成的实例变量的名称
      @dynamic 说明程序员手动实现实例变量以及存取方法,此时,即便没有实现存取方法,编译器也不会报错

    tips: 特殊的一些情况,当程序员自己重写了所有的存取方法时(包括仅重写 readonly 属性的get方法),编译器认为程序员要手动实现属性,不会进行自动合成。需要通过 @systhesis 或者 @dynamic 手动声明成员变量

    1. protocol 和 category 中对属性的实现
      在两者中添加属性仅生成方法的声明,须由自己添加实现

    2. property 修饰符/关键字
      a:原子性
      nonatomic : 不添加锁保证原子性(一般是不添加,原因开销大,不能保证线程安全),默认值是加锁。并没有atomic的修饰符

    b:读写权限
    readonly :只读。只生成get方法
    readwrite : 读写。默认值。

    c:内存管理语义
    (ARC)
    strong : 修饰对象属性,表示具有强引用关系
    weak: 修饰对象属性,标识弱引用关系(不持有指向对象的值,当指向对象被销毁时,该属性值被置为 nil 保证安全)
    assign: 修饰基本数据类型。在set方法中仅做煎蛋的赋值运算
    unsafe_unretained: 与weak相同,(指向对象呗销毁时,属性值不会置为 nil )
    copy: 对于具有可变子类的不可变父类的修饰,block的修饰

    d:setter、getter方法名称
    应用场景 :
    getter,当属性值为布尔值时,一般通过getter在属性值前添加is
    例如 UISwitch 中的on 属性,通过getter = isOn,将其重写为 isOn
    setter,
    当返回数据明后才能为initxxx时。编译器认为所有init 开头的方法都是初始化方法,将返回本类的一个实例。
    由此会造成冲突
    可采用这样的写法 setter=set_pInitXxx getter = pInitXxx

    e:其他 (nonnull,nullable)

    相关文章

      网友评论

          本文标题:iOS 关于@property

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