美文网首页
面试常考--属性修饰符

面试常考--属性修饰符

作者: Hardy_Hu | 来源:发表于2017-06-29 15:21 被阅读0次

    在iOS中属性用于封装数据,自动生成get和set方法。面试中经常会被问到assign、strong、weak、copy、unsafe_unretained、retain区别, 在<<Effective Objective-C 2.0>>中有详细的介绍。

    • assign 修饰纯数据类型的简单赋值,如CGFloat或Int。
    • strong 表明属性定义了一种拥有关系,为这种属性设置新值时,先保留新值,并释放旧值,然后在将新值设置上去,计数加1。
    • weak 表明属性定义了一种非拥有关系,为这种属性设置新值时,设置方法既不保留新值,也不释放旧值。在属性所值的对象遭到摧毁时,属性值也清空。
    • copy 与strong类似,但是设置方法并不保留新值,而是将其拷贝。
    • ** retain** ARC下strong等同于MRC下的retain,都是计数加1。
    • ** unsafe_unretained** 于assign差不多,但是它适用于对象类型,表明非拥有关系,当目标对象遭到摧毁的时候,属性值不会自动清空,这一点与weak有区别。
    • ** atomic** 设置成员变量的@property属性时,默认为atomic,提供多线程安全。在多线程环境下,原子操作是必要的,否则有可能引起错误的结果。加了atomic,setter函数会变成下面这样:
      {lock}
      if (property != newValue)
     { 
           [property release]; 
           property = [newValue retain]; 
    }
          {unlock}
    
    • nonatomic 非原子性,禁止多线程,变量保护,提高性能。

    注意:atomic是Objc使用的一种线程保护技术,基本上来讲,是防止在写未完成的时候被另外一个线程读取,造成数据错误。而这种机制是耗费系统资源的,所以在iPhone这种小型设备上,如果没有使用多线程间的通讯编程,那么nonatomic是一个非常好的选择。

    • readwrite 申明属性可读可写,拥有set方法和get方法。

    • readonly 只读属性,只能获取属性值,不能写属性值。

    • getter=name指定属性值获取方法名。如

    @property (nonatomic, getter = isOn) BOOL on;
    
    • setter=name指定设置方法名,这种用法不太常见。

    在iOS内存管理中时刻默念计数式内存管理的思考方法:
    自己生成的对象,自己持有。
    非自己生成的对象,自己也能持有。
    不再需要自己持有的对象时释放。
    非自己持有的对象无法释放。

    相关文章

      网友评论

          本文标题:面试常考--属性修饰符

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