【问题标题】:What is the correct attribute for a setter/getter for an int?int 的 setter/getter 的正确属性是什么?
【发布时间】:2011-10-05 12:28:51
【问题描述】:

我见过许多不同的方法来属性化/合成一个 int,但我不知道正确的方法。

我通常这样做:

@property (nonatomic, assign) int myInt

但我见过人们使用:

@property (nonatomic) int myInt
@property int myInt

哪种方式正确?

【问题讨论】:

    标签: iphone objective-c properties getter-setter


    【解决方案1】:

    这里是a great post about the difference between atomic and nonatomic

    假设您正在@synthesizing 方法实现,原子 与非原子更改生成的代码。如果您正在编写自己的 设置器/获取器,原子/非原子/保留/分配/复制只是 建议。

    使用 atomic,合成的 setter/getter 将确保一个整体 value 总是从 getter 返回或由 setter 设置, 无论任何其他线程上的设置器活动如何。也就是说,如果线程 A 在 getter 的中间,而线程 B 调用 setter,一个 实际可行的价值——一个自动释放的对象,很可能——将是 返回给 A 中的调用者。

    在非原子中,没有这样的保证。因此,非原子是 比原子快得多。

    atomic 不做的就是对线程安全做出任何保证。如果 线程 A 与线程 B 和 C 同时调用 getter 用不同的值调用setter,线程A可能会得到任何一个 返回的三个值——在调用任何 setter 之前的那个 或传递给 B 和 C 中的设置器的值中的任何一个。同样, 该对象可能以 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 被包括在内是一个假设的例子。

    【讨论】:

    • 您可能会提到atomic 实际上并不作为属性的关键字存在,因此前两个示例是假设的。
    【解决方案2】:

    默认值是分配和原子

    【讨论】:

      【解决方案3】:

      这更多的是风格问题,而不是技术正确性问题。对于 int 类型,唯一 必须 使 assign 修饰符为真(因为您不保留标量)。否则,它是特定于上下文的:读写或只读,原子或非原子,这取决于应用程序。

      请注意,如果您不指定修饰符,则会应用默认值(原子、读写、分配)。所以你的例子你的第一个例子是相同的,第三个只是原子性不同。

      【讨论】:

        【解决方案4】:

        @property(nonatomic,assign)int myVariable;

        永远记住 assign 将用于 int 、 bool 等原始数据类型

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-25
          • 2017-05-21
          • 2016-12-21
          • 1970-01-01
          相关资源
          最近更新 更多