美文网首页
readwrite, readonly, assign, ret

readwrite, readonly, assign, ret

作者: 面糊 | 来源:发表于2016-06-15 19:20 被阅读62次

    readwrite, readonly, assign, retain, copy, nonatomic, atomic是什么作用, 在那种情况下用

    1. readwrite

      • 可读可写特性, 需要生成setter和getter方法时使用, 可被外界读取和修改
    2. readonly

      • 只读特性, 只会生成getter方法, 只可被外界读取, 不能修改
    3. assign

      • 赋值特性, 作用于非OC对象的赋值, setter方法将参数传给变量
    4. retain

      • 持有特性, 他的setter方法会释放旧址, 然后引用住新值, 并且将新值的引用计数+1, 只能作用于OC对象(基本数据类型和Core Foundation对象没有引用计数的概念, 因此不能用retain)

          - (void)setName:(NSString *)newName { 
              if (name != newName) { 
                 [name release]; 
                 name = [newName retain]; 
                 // name’s retain count has been bumped up by 1 
              } 
          }
        
    5. copy

      • 复制特性, 此属性只对遵守了NSCopying协议的对象类型有效, 一般作用于NSString, NSArray, NSDictionary等有可变类型的对象
      • 如果copy的是不可变类型, 就不会开辟新的内存空间, 并且为指针拷贝, 指向同一个内存地址: 浅拷贝
      • 如果copy的是可变类型, 就会开辟新的内存空间, 并且将内容copy下来单独保存: 深拷贝
      • 注意: 如果在系统中创建内容相同的不可变字符串, 系统会自动做出优化, 指向同一块内存空间
    6. nonatomic

      • 非原子性, 即非线程安全的, 不给变量提供线程锁保护, 这样会提高性能
      • 在iOS的移动端, 一般不会出现多线程访问同一个属性的情况, 就算发生情况, atomic也不能完美的保证安全, 并且还需要手动增加线程锁, 因此对于变量都应该使用nonatomic
    7. atomic

      • atomic会给属性加上一个同步锁, 这是为了防止多线程同时访问属性出现异常需要添加的属性, 但是这样会增加额外的内存开销 并且在变编程习惯中, 我们都应该避免多线程访问统一资源
      • 即便是使用atomic, 在多线程时也无法完全保证线程安全, 往往是需要手动添加线程锁

    相关文章

      网友评论

          本文标题:readwrite, readonly, assign, ret

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