Why properties are always said to be made nonatomic in Objective C?
本问题已经有最佳答案,请猛点这里访问。
据说
声明属性
由于大多数IOS下的类,特别是与UI相关的类,将在单线程环境中使用,因此可以安全地删除
见目标C中原子与非原子的区别
原子的
原子属性是属性的默认行为;如果不将上述属性显式设置为非原子属性,它将是原子属性。
原子属性在获取或设置值时添加线程安全级别。也就是说,无论其他线程在做什么,属性的getter和setter都将始终完全完成。权衡的是,这些属性的访问速度要比非原子等效属性慢一些。
非原子的
非原子属性不是线程安全的,将直接返回其属性。这将比原子性质更快,但如果不采取预防措施,显然会带来一些风险。
1 | @property (strong) NSString *str; |
原子属性是属性的默认行为;如果不将上述属性显式设置为非原子属性,它将是原子属性。
这些原子属性的setter&getter
1 2 3 4 5 6 7 8 9 | -(NSString *) str{ @synchronized(self){ return str; }} -(void) setStr: (NSString *) newString { @synchronized(self) { str = newString; }} |
原子属性在获取或设置值时添加线程安全级别。也就是说,无论其他线程在做什么,属性的getter和setter都将始终完全完成。与非原子等效物相比,这些属性的访问速度要慢一些。
1 | @property (strong,nonatomic) NSString *str; |
非原子属性不是线程安全的,将直接返回其属性。这将比原子性质更快,但如果不采取预防措施,显然会带来一些风险。
这些非原子属性的setter和getter
1 2 3 4 5 6 7 | -(NSString *) str{ return str; }} -(void) setStr: (NSString *) newString{ str = newString; } |
因此,通过研究原子和非原子的setter&getter方法,非原子方法非常轻。