【问题标题】:using ARC, lifetime qualifier assign and unsafe_unretained使用 ARC、lifetime qualifier assign 和 unsafe_unretained
【发布时间】:2012-01-13 21:55:14
【问题描述】:

我对这两个限定词有点困惑...... 使用 ARC 而不是使用 weak(即如果我需要支持 iOS 4)我可以使用 unsafe_unretained 失去自动零功能......最终结果似乎类似于 assign

  • 我可以用assign 交换unsafe_unretained 吗?
  • 这些限定符是一回事吗?

Apple 文档中有关此论点的任何链接都会非常有趣...我只能找到几行 here

【问题讨论】:

标签: objective-c ios automatic-ref-counting


【解决方案1】:

Clang 的 technical specification of ARC 详细介绍了限定符的工作原理。

但是,回答您的问题:assign__unsafe_unretained 不是一回事。 assign 是一个属性属性,它告诉编译器如何合成属性的 setter 实现,而 __unsafe_unretained 是一个所有权限定符,它告诉 ARC 如何插入 retain/release 调用。但它们是相关的:在声明一个属性时,assign 意味着 __unsafe_unretained 所有权。

在 ARC 之前,assign 是默认的财产所有权限定符;但启用 ARC 后,可保留对象指针类型的默认值为 strong。 (对于标量和其他指针类型,assign 仍然是默认值。)

【讨论】:

  • 是的,对于 iOS 4.3,您应该使用 unsafe_unretainedassign,因为 weak 不可用。请注意,任何具有这些生命周期限定符的指针在释放后都不会自动归零(因此它们有可能成为悬空指针)。另外,我相信这可能在编写原始答案后发生了变化,但是 ARC 中对象属性的默认限定符是 strong 而不是 assign
  • 我认为这个回复错过了原始发布者的问题,这是关于assignunsafe_unretained(没有双下划线前缀)属性属性之间的区别。根据上面链接的文档的section 4.1,这两个属性都映射到__unsafe_unretained(带有下划线)所有权,实际上看起来是等价的。我认为唯一的区别是,在 ARC 下,应该将 assign 用于非指针,将 unsafe_unretained 用于指针类型。
  • 您在属性声明中并没有真正看到 unsafe_unretained。对于非 ARC,它要么是弱/强,要么是分配/强。我唯一一次使用 __unsafe_unretained(带有 2 个下划线)是将对象指针保存在结构中:Struct s { __unsafe_unretained id obj ; } ;
  • unsafe_unretained 作为属性属性的目的是为assign提供一个看起来更可怕的同义词。逻辑是,如果它不安全,它应该看起来不安全。
  • 我喜欢“看起来更可怕的同义词”——非常贴切的描述。 :-) 当然,重点是提请注意使用该物业所需的额外注意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-12
  • 2013-03-08
  • 2016-12-05
  • 2012-02-27
相关资源
最近更新 更多