iOS 关于@property

2018-12-20  本文已影响8人  lixiaoshuai

关于 @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)

上一篇 下一篇

猜你喜欢

热点阅读