readwrite, readonly, assign, retain, copy, nonatomic, atomic是什么作用, 在那种情况下用
-
readwrite
- 可读可写特性, 需要生成setter和getter方法时使用, 可被外界读取和修改
-
readonly
- 只读特性, 只会生成getter方法, 只可被外界读取, 不能修改
-
assign
- 赋值特性, 作用于非OC对象的赋值, setter方法将参数传给变量
-
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 } }
-
-
copy
- 复制特性, 此属性只对遵守了
NSCopying
协议的对象类型有效, 一般作用于NSString, NSArray, NSDictionary等有可变类型的对象
- 如果copy的是不可变类型, 就不会开辟新的内存空间, 并且为指针拷贝, 指向同一个内存地址: 浅拷贝
- 如果copy的是可变类型, 就会开辟新的内存空间, 并且将内容copy下来单独保存: 深拷贝
- 注意: 如果在系统中创建内容相同的不可变字符串, 系统会自动做出优化, 指向同一块内存空间
- 复制特性, 此属性只对遵守了
-
nonatomic
- 非原子性, 即非线程安全的, 不给变量提供线程锁保护, 这样会提高性能
- 在iOS的移动端, 一般不会出现多线程访问同一个属性的情况, 就算发生情况, atomic也不能完美的保证安全, 并且还需要手动增加线程锁, 因此对于变量都应该使用nonatomic
-
atomic
- atomic会给属性加上一个同步锁, 这是为了防止多线程同时访问属性出现异常需要添加的属性, 但是这样会增加额外的内存开销 并且在变编程习惯中, 我们都应该避免多线程访问统一资源
- 即便是使用atomic, 在多线程时也无法完全保证线程安全, 往往是需要手动添加线程锁
网友评论