我已经看到了许多不同的方法来实现/合成int,但是我不知道正确的方法。
我通常会:
@property (nonatomic, assign) int myInt
但我见过人们使用:
@property (nonatomic) int myInt
@property int myInt
哪条路是正确的?
最佳答案
这里是a great post about the difference between atomic
and nonatomic
:
假设您正在合成方法实现,atomic
与非原子更改生成的代码相比。如果你是自己写的
setter/getter、atomic/nonatomic/retain/assign/copy仅仅是
咨询的。
使用原子,合成的setter/getter将确保
值总是从getter返回或由setter设置,
不管其他线程上的setter活动如何。也就是说,如果线程
A在getter的中间,而线程B调用setter,
实际可行的值——很可能是一个自动释放的对象——将是
返回到a中的调用方。
在非原子的情况下,没有这样的保证。因此,非原子是
比原子快得多。
atomic不做的是保证线程安全。如果
线程A用线程B和C同时调用吸气剂。
用不同的值调用setter,线程A可以得到
返回的三个值——在调用任何setter之前的值
或者在b和c中传递给setter的任何一个值。同样,
这个对象可能以b或c的值结束,无法判断。
确保数据完整性——主要挑战之一
多线程编程是通过其他方式实现的。
注意默认值是atomic
,因此最后一个示例等于
@property (atomic) int myInt
另一个缺省值是
assign
,因此这两个选项是等价的:@property (nonatomic, assign) int myInt
@property (nonatomic) int myInt
同样,以下也相当
@property (atomic, assign) int myInt
@property (atomic) int myInt
编辑:正如josh所指出的,
atomic
被包含是一个假设的例子。关于iphone - int的setter/getter的正确属性是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6696730/