美文网首页
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