【问题标题】:In Objective-C with ARC, is it true that we usually only need to specify nonatomic as property attributes?在带有 ARC 的 Objective-C 中,我们通常只需要指定非原子作为属性属性是真的吗?
【发布时间】:2012-06-17 23:09:24
【问题描述】:

奇怪的是,在 Big Nerd Ranch iOS 5 书 (p.73) 和 Programming iOS 5 书 (O'Reilly, p.314) (更新:甚至 Kochan 的 Objective-C 书第四版),在 ARC 的上下文中,他们说 properties 属性的默认值是 assign... 但是 Apple's documentation 说默认值是 strong

我还尝试了一个简单的程序,如果我不指定strong,程序可以正常工作,如果我指定strong,它的工作方式相同,而当使用assign 时,编译器会显示一个警告,所以看起来默认确实是strong

所以如果大多数时候,我们想要

@property (nonatomic, readwrite, strong) NSMutableArray *foo;

那么我们就可以写了

@property (nonatomic) NSMutableArray *foo;

因为其他两个(readwritestrong)是默认的?

【问题讨论】:

  • Assign 仅与无 ARC 一起使用,这就是您收到编译器警告的原因。
  • 但警告不是关于在 ARC 中使用 assign。它是关于对象将比通常预期的更早释放
  • assign 与 ARC 下的 unsafe_unretained 相同。换句话说,行为与 MRC 下的 assign 相同。

标签: objective-c automatic-ref-counting


【解决方案1】:
【解决方案2】:

readwrite 和 strong,确实是 ARC* 下的默认值。在手动引用计数下,assign 是(是)默认值。我更喜欢明确指定这些,因为它可以更清楚地说明@property 的参数是什么,而不是让阅读代码的人知道默认值是什么。

*strong 是默认值,假设您让编译器为您合成一个实例变量,或者声明了一个没有显式所有权限定符的实例变量(在这种情况下,ivar 无论如何默认为__strong)。否则,默认属性所有权类型与 ivar 声明中的所有权限定符匹配。因此,如果您使用__weak 显式声明一个ivar,然后为它声明一个没有所有权限定符的@property,则综合属性将是弱的。这一切都记录在Clang ARC documentation 中。

【讨论】:

  • 是的...如果其他人可以阅读代码...那么您是否只指定nonatomic, strong
  • 顺便说一句...甚至 Kochan 的 Objective-C 书都说默认不是strong...所以最近可能发生了一些变化...
  • 如我的回答中所述,strong 是 ARC 下的默认设置。 assign 是手动内存管理下的默认值(即非 ARC),所以是的,当引入 ARC 时,新代码的默认值有效地改变了。我在声明属性时总是明确指定所有权。
  • 啊,好的。在那种情况下,他们错了。我在回答中链接到的文档确认 strong 是 ARC 下的默认设置。
  • 你是对的。准确地说是在 LLVM 3.1 中,这解释了这些书籍与当前情况的不同。
猜你喜欢
  • 2012-12-25
  • 1970-01-01
  • 2012-06-10
  • 2013-07-08
  • 1970-01-01
  • 2017-02-21
  • 1970-01-01
  • 2011-09-08
  • 2012-05-22
相关资源
最近更新 更多