【问题标题】:What are the default attributes for Objective-C properties?Objective-C 属性的默认属性是什么?
【发布时间】:2011-12-11 06:01:57
【问题描述】:

当您没有在目标 C 中列出任何属性时,属性的默认属性是什么?

例如,如果我这样写:

@property float value;

默认设置是什么,比如它是只读的,它是否保留......等等?

【问题讨论】:

  • 请阅读常见问题解答 - 您尚未接受任何答案。我看到的至少一个答案解决了您的问题。 stackoverflow.com/faq
  • Apple 文档中的 search for "properties" 将您直接带到“声明的属性”规范,其中有一个部分 "Property Declaration Attributes" 可以完全回答您的问题。
  • @JoshCaswell,谢谢链接现在已经死了,这个问题现在是谷歌第一个命中。因此,忽略问题或通过引用外部网站来回答问题更具历史建设性。
  • @JamesMcMahon:通过几分钟的搜索,仍然可以在 Apple 文档中找到该信息:developer.apple.com/library/mac/documentation/General/… 请注意,下面的答案已过时,所以即使所以答案也不能幸免。在问别人之前做自己的研究总是有建设性的。

标签: objective-c cocoa-touch


【解决方案1】:

默认/隐式值为atomicreadwriteassign

原子

这意味着该值是原子读/写的。与有些流行的误解相反,原子性等同于线程安全。简单来说,它保证您读取或写入的值将被整体读取或写入(当使用访问器时)。即使你一直使用访问器,它也不是严格线程安全的。

读写

该属性有一个 setter 和一个 getter。

分配

此默认值通常用于 POD(Plain-Old-Data)和内置类型(例如 int)。

对于NSObject 类型,您将倾向于持有强引用。在大多数情况下,您将声明属性copystrongretainassign 不执行引用计数操作。另见:http://clang.llvm.org/docs/AutomaticReferenceCounting.html#property-declarations

在某些情况下,该属性可能在 ARC 下隐式为 strong

在没有所有权来源的情况下合成的可保留对象指针类型的属性具有其关联实例变量的所有权,如果它已经存在的话;否则,[从 Apple 3.1,LLVM 3.1 开始] 它的所有权隐含地很强。在此修订版之前,合成这样的属性是不正确的。

【讨论】:

  • "...您几乎在所有情况下都需要保留或复制。分配不执行引用计数操作。" -> ARC 仍然如此吗?我会假设使用 ARC 不再需要在属性中进行引用计数操作?
  • @jbandi 我已经为 ARC 更新了它。 ARC 也使用引用计数——您的引用计数操作由编译器添加。
  • 感谢您的更新……但您的回答现在对我来说还不是很清楚。正如我从您添加的 clang-link 和这个 SO 答案中收集的那样:stackoverflow.com/a/11041397/32749strong 而不是 retain 是自 LLVM 3.1 以来使用 ARC 时的默认属性。 .. 因此,作为程序员,我在使用 ARC 时无需显式声明 strong。你同意吗?
  • @jbandi 规则比以前更复杂了。有时间我会更新答案,这样强引用的情况可能是隐式/默认的,而不是赋值。
【解决方案2】:

等于

@property (atomic, readwrite, assign) float value;

【讨论】:

    【解决方案3】:

    Objective-C 属性属性

    [Objective-C property]

    在Objective-C中,当你写@property时,你写了一个属性列表

    默认属性:

    • 指针:strongatomic, readwrite

    • 原语:assignatomic, readwrite

      @property (atomic, readwrite, strong) NSString *someString;
      @property (atomic, readwrite, assign) int someInt;
      

    原子性只是线程安全的一部分 - Atomic Operations[About]

    • atomic(默认)——保证你不会得到一些垃圾内存,它总是会包含一些值。

    • nonatomic - 你可以在多线程环境中获取垃圾数据,但由于缺乏额外的逻辑,它会快一点

    访问权限 - 修改访问权限

    • readwrite(默认)- 生成 getter 和 setter 并可以使用它们

    • readonly - 只生成 getter。您无法设置某些值

    存储 - 自动生成的backed instance variables (backing iVar)[About] 的内存管理

    • strong(指针的默认值)- 当强支持的 iVar 具有对它的引用时,无法释放对象

    • retain 历史上是在 strong 之前创建的,具有相同的想法。不同的是retain应该在ARC被禁用时使用

    • assign(原语的默认值)- 超出引用计数

    • weak - 这个参考没有像strong 那样被考虑(+1)。这就是为什么当所有其他strong 引用离开我们的对象时,我们的引用将指向nil。它用于与Retain cycle 战斗,委托模式就是一个很好的例子[About]

    • unsafe_unretained - 类似于weak,但是当没有人引用对象时,我们的 iVar 将指向一些垃圾(dangling pointer)并且不会出现预期行为。它的性能可以比weak好一点

    • copy - 当你将一些对象传递给我们属性的设置器时,一个新的对象副本被分配给 iVar(NSCopying 协议)

    [Swift weak vs unowned]

    【讨论】:

      猜你喜欢
      • 2015-12-15
      • 2012-04-07
      • 1970-01-01
      • 2010-12-06
      • 1970-01-01
      • 2011-01-18
      • 2012-06-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多