美文网首页
iOS开发中的属性关键字

iOS开发中的属性关键字

作者: 小鱼儿喜欢花无缺 | 来源:发表于2016-12-12 17:03 被阅读23次

    一、@property

    @property 其实就是在编译阶段由编译器自动帮我们生成 ivar 成员变量,getter 方法,setter 方法。

    使用“自动合成”( autosynthesis)这个过程由编译器在编译阶段执行自动合成,所以编辑器里看不到这些“合成方法”(synthesized method)的源代码。除了生成 getter、setter 方法之外,编译器还要自动向类中添加成员变量(在属性名前面加下划线,以此作为实例变量的名字)。为了搞清属性是怎么实现的,反编译相关的代码,他大致生成了五个东西:

    每次增加一个属性,系统都会在 ivar_list 中添加一个成员变量的描述,在 method_list 中增加 setter 与 getter 方法的描述,在 prop_list 中增加一个属性的描述,计算该属性在对象中的偏移量,然后给出 setter 与 getter 方法对应的实现。

    在 setter 方法中从偏移量的位置开始赋值,在 getter 方法中从偏移量开始取值,为了能够读取正确字节数,系统对象偏移量的指针类型进行了类型强转。

    二、readwrite,readonly,assign,retain,copy,nonatomic,atomic,strong,weak属性的作用分别是什么

    readwrite 此标记说明属性会被当成读写的,这也是默认属性。

    readonly 此标记说明属性只可以读,也就是不能设置,可以获取。

    assign 不会使引用计数加1,也就是直接赋值。

    retain 会使引用计数加1。

    copy 建立一个索引计数为1的对象,在赋值时使用传入值的一份拷贝。

    nonatomic 非原子性访问,多线程并发访问会提高性能。

    atomic 原子性访问。

    strong 打开ARC时才会使用,相当于retain。

    weak 打开ARC时才会使用,相当于assign,可以把对应的指针变量置为nil。

    三、什么情况使用 weak 关键字,相比 assign 有什么不同?

    首先明白什么情况使用 weak 关键字?

    在 ARC 中,在有可能出现循环引用的时候,往往要通过让其中一端使用 weak 来解决,比如:

    1. delegate 代理属性,代理属性也可使用

    2. assign自身已经对它进行一次强引用,没有必要再强引用一次,此时也会使用 weak

    3. 自定义IBOutlet 控件属性一般也使用weak;当然,也可以使用 strong,但是建议使用 weak

    weak 和 assign 的不同点

    weak 策略在属性所指的对象遭到摧毁时,系统会将 weak 修饰的属性对象的指针指向 nil,在 OC 给 nil 发消息是不会有什么问题的;如果使用 assign 策略在属性所指的对象遭到摧毁时,属性对象指针还指向原来的对象,由于对象已经被销毁,这时候就产生了野指针,如果这时候在给此对象发送消息,很容造成程序奔溃assigin 可以用于修饰非 OC 对象,而 weak 必须用于 OC 对象。

    相关文章

      网友评论

          本文标题:iOS开发中的属性关键字

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