【问题标题】:Different among __weak, __block and __assign? [duplicate]__weak、__block 和 __assign 有什么区别? [复制]
【发布时间】:2023-12-13 02:50:01
【问题描述】:

1) *说:“weak (_weak) 和assign (_assign) 的区别在于,当变量指向的对象被释放时,变量的值是否在是否更改。弱的将被更新为 nil,而分配的将保持不变,作为悬空指针。"

但是在我尝试了这样的 Xcode 示例之后

__weak NSObject *obj1 = [[NSObject alloc] init];
[obj1 release];

如果Wiki 是对的,那么发布后obj1 指向的地址必须是nill。但是obj1指向的地址还是0xabcdef... 维基错了吗?

2) 帮我区分__weak, __block, __assign

【问题讨论】:

  • 没有__assign 这样的东西。您可以使用assign 属性定义属性,但没有__assign 关键字,就像__weak 一样。 __block 与您问题的主要部分完全无关。
  • 那么维基是对还是错???
  • 我读过那个话题,但我仍然不了解 __weak, __block
  • *的文章是正确的。但请理解,该变量可能不会立即设置为nil。在某些情况下,它直到稍后才设置为nil。其中一些可能取决于优化级别。

标签: objective-c memory-management block null weak-references


【解决方案1】:

“清零弱引用”的__weak 属性仅在使用 ARC(自动引用计数)时可用

您的代码显然是使用 MRC(手动引用计数)编译的。在这种情况下, __weak attribute 只是忽略,您应该收到编译器警告

未启用 ARC 时,无法在自动变量上指定 __weak 属性 [-Wignored-attributes]

因此,释放对象对obj1 变量本身没有影响。它是一个 悬空指针,指向一个已释放的实例。


如果您将代码转换为 ARC,则必须删除 release 语句。 现在你会得到一个不同的警告

将保留对象分配给弱变量;分配后对象将被释放 [-Warc-unsafe-retained-assign]

该对象将被释放并立即将obj1 设置为nil,因为分配后没有对该对象的强引用。

【讨论】: