我已经看到了许多不同的方法来制作/合成一个int,但我不知道正确的方法。
我通常会这样做:
@property (nonatomic, assign) int myInt
但我见过人们使用:
@property (nonatomic) int myInt
@property int myInt
哪种方式正确?
答案 0 :(得分:3)
以下是a great post about the difference between atomic
and nonatomic
:
假设你是@synthesizing方法实现,原子 与非原子相比,生成的代码更改。如果你是自己写的 setter / getters,atomic / nonatomic / retain / assign / copy仅仅是 咨询。
使用原子,合成的setter / getter将确保整体 值始终从getter返回或由setter设置, 不管任何其他线程的setter活动。也就是说,如果是线程 A在getter的中间,而线程B调用setter,a 实际可行的价值 - 一个自动释放的对象,很可能 - 将是 返回给A的来电者。
在非原子能方面,没有这样的保证。因此,非原子是 比原子快得多。
什么原子不做是对线程安全做出任何保证。如果 线程A与线程B和C同时调用getter 调用具有不同值的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
被包含在内是一个假设的例子。
答案 1 :(得分:0)
默认值为assign和atomic
答案 2 :(得分:0)
这更像是一种风格问题而不是技术正确性问题。对于int类型,唯一具有的assign
修饰符为真(因为您不保留标量)。否则,它是特定于上下文的:readwrite或readonly,atomic或nonatomic,它取决于应用程序。
请注意,如果未指定修饰符,则应用默认值(atomic,readwrite,assign)。所以你的例子是第一个其他例子是相同的,第三个只是原子性不同。
答案 3 :(得分:0)
@property(nonatomic,assign)int myVariable;
始终记住assign将用于原始数据类型,如int,bool