Objective-C属性的默认属性是什么?

47

如果在Objective-C中不列出任何属性,一个属性的默认属性是什么?

例如,如果我写了这个:

@property float value;

默认情况下会是什么样子,例如它是否是只读的,是否保留等等?


4
请查看常见问题解答 - 您还没有接受任何答案。我看到至少有一个答案解决了您的问题。http://stackoverflow.com/faq - mrtsherman
4
在苹果文档中搜索“properties”会直接跳转到“Declared Properties”规范,其中有一个“Property Declaration Attributes”部分,完整回答了你的问题。请注意,我的翻译不包含解释或其他内容。 - jscs
@JoshCaswell,该链接现在已失效,而这个问题现在是谷歌搜索结果中的前几个。因此,更有建设性的做法是忽略这个问题或者回答它并提供外部网站的参考资料。 - James McMahon
@JamesMcMahon:只需花费几分钟搜索,您仍然可以在苹果文档中找到相关信息:https://developer.apple.com/library/mac/documentation/General/Conceptual/DevPedia-CocoaCore/DeclaredProperty.html#//apple_ref/doc/uid/TP40008195-CH13-SW1 请注意,下面的答案也已经过时,因此即使是SO答案也不是免疫的。在向他人提问之前自己进行调查研究始终是有益的。 - jscs
3个回答

69

默认/隐式值是atomicreadwriteassign

atomic

这意味着值是原子性读取/写入的。与某些常见误解相反,原子性不等同于线程安全。简单来说,它保证了您读取或写入的值将在访问器被使用时完整地读取或写入。即使您一直使用访问器,它也不是严格的线程安全。

readwrite

属性被赋予了一个setter和一个getter。

assign

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

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

strong

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

  

可保留对象指针类型的属性,如果它没有所有权来源,则绑定到其关联的实例变量的所有权(如果实例变量已经存在); 否则,[从Apple 3.1开始,LLVM 3.1] 其拥有权是隐式的强引用。在此修订之前,合成此类属性无效。


“...你几乎在所有情况下都需要保留或复制。赋值操作不执行引用计数操作。” -> 在ARC中是否仍然如此?我本以为在ARC中属性不再需要进行引用计数操作了? - jbandi
1
@jbandi 我已经为ARC更新了它。ARC使用引用计数 -- 你的引用计数操作是由编译器添加的。 - justin
2
谢谢您的更新...但是您的回答现在仍然不是很清楚。从您添加的clang-link和这个SO答案中我了解到:自LLVM 3.1以来,在使用ARC时,strong而不是retain是默认值...因此,当我使用ARC时,作为程序员,没有必要显式声明strong。您同意吗? - jbandi
@jbandi 规则比以前更复杂了。我会在有时间的时候更新答案,这样强引用可能是隐式/默认而不是分配的情况也会被考虑进去。 - justin

8

它等同于

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

3

Objective-C 属性属性

[Objective-C 属性]

在 Objective-C 中,当您编写 @property 时,在编写属性列表后

默认属性:

  • pointer: strong, atomic, readwrite

  • primitive: assign, atomic, readwrite

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

原子性只是线程安全的一部分 - 原子操作[关于]

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

  • nonatomic - 在多线程环境中,您可以获得垃圾数据,但由于缺少附加逻辑,速度略快

访问 - 修改访问

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

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

存储 - 用于backed instance variables(backing iVar)[关于]的内存管理,这些变量会自动生成

  • strong(指针的默认值)- 当强支持的iVar引用它时,对象不能被释放

  • retain是在strong创建之前历史悠久的,具有相同的想法。 差异在于,retain应在禁用ARC时使用

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

  • weak - 此引用不会被视为strong所做的+1。 这就是为什么当所有其他strong引用都超出我们对象时,我们的引用将指向nil。 它用于解决保留周期问题,委托模式是一个很好的例子[关于]

  • unsafe_unretained - 类似于weak,但是当没有任何引用指向对象时,我们的iVar将指向一些垃圾(dangling pointer),行为不被期望。 它可以比weak具有稍微更好的性能

  • copy - 当您将某个对象传递到我们属性的setter中时,将分配一个新的对象副本给iVar(NSCopying协议)

[Swift weak vs unowned]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接