问题

在属性声明中 atomic 非原子是什么意思?

@property(nonatomic, retain) UITextField *userName;
@property(atomic, retain) UITextField *userName;
@property(retain) UITextField *userName;

这三者之间的操作差异是什么?



解决方法

最后两个是相同的; "atomic"是默认行为(注意,它实际上不是一个关键字;它仅由非原子 - atomic 在最近的llvm / clang版本中被添加为关键字.

假设您是@合成方法实现,原子与非原子更改生成的代码.如果你正在写你自己的setter / getters,atomic / nonatomic / retain / assign / copy只是建议. (注意:@synthesize现在是最近版本的LLVM的默认行为,也没有必要声明实例变量;它们也会被自动合成,并且会有一个 _ 以防止意外直接访问).

对于"atomic",合成的setter / getter将确保整个值总是从getter返回或由setter设置,而不管任何其他线程上的setter活动.也就是说,如果线程A在getter的中间而线程B调用setter,一个实际可行的值 - 一个autoreleased对象,很可能 - 将返回给A中的调用者.

非原子中,不做任何此类保证.因此, nonatomic 比"atomic"快得多.

做什么"原子"是对线程安全的任何保证.如果线程A在线程B和C同时调用getter,并且调用具有不同值的setter,线程A可以获得返回的三个值中的任何一个 - 在调用任何setter之前的值或传递到setter中的值之一在B和C中.同样,对象可能以B或C的值结束,无法告诉.

确保数据完整性 - 多线程编程的主要挑战之一是通过其他方式实现.




相关问题推荐