为啥在 ARC 中发送消息会导致保留周期警告,但属性集不会?

Posted

技术标签:

【中文标题】为啥在 ARC 中发送消息会导致保留周期警告,但属性集不会?【英文标题】:Why does a message send cause a retain cycle warning in ARC, but a property set does not?为什么在 ARC 中发送消息会导致保留周期警告,但属性集不会? 【发布时间】:2012-12-24 05:36:22 【问题描述】:
[self.foo setBlock:^
    [self doSomething]; // causes warning
];

[self.foo setBlock:^
    self.bar = baz;     // does not cause warning
];

警告“在此块中强烈捕获 self 可能会导致保留周期。”

两者都不会导致强引用吗?

【问题讨论】:

如果将第二个示例更改为[self setBar:baz];,您会收到警告吗? 是的,如果我通过该语法设置属性,那么我会这样做。 编译器错误。可能会在以后的版本中修复。 我明白了。这是 xcode 4.5 FWIW。 很奇怪。 self.bar = baz[self setBar:baz] 应该是相同的:/ 【参考方案1】:

这是一个编译器错误,您应该向 Apple 提交错误报告。

两者都是一样的,a.b = c 只是写[a setB: c] 的方式不同。如果编译器处理一个与另一个不同,这就是一个错误。

【讨论】:

以上是关于为啥在 ARC 中发送消息会导致保留周期警告,但属性集不会?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在启用 ARC 的项目中不需要维护保留计数

更新到 iOS 6.1 后出现 ARC Retain Cycle

[UINavigationController 保留]:发送到已释放实例的消息

这会导致保留周期吗

ARC 禁止发送“保留”问题的显式消息

在此块中强烈捕获自我可能会导致保留周期