【问题标题】:Objective-C ARC __weak variable reference triggers warning "__weak attribute cannot be specified on an automatic variable"Objective-C ARC __weak 变量引用触发警告“无法在自动变量上指定 __weak 属性”
【发布时间】:2012-08-23 09:25:46
【问题描述】:

我有一个应用程序(仅限 ios5),它在方法内部声明了一个弱变量,用于在块内引用视图控制器的实例。

 QRCodeViewController * __weak weakSelf = self;

问题是编译器显示警告说:

__weak 属性不能在自动变量上指定

在那个应用程序中,我使用了很多弱引用,我从来没有看到过这样的警告,与其他类的唯一区别是这个类是在 .mm 文件中实现的,因为它使用 c++ 对象并且项目可以如果我将其保留为 .m,则不编译。
我必须说代码似乎运行良好。
有什么建议吗?

【问题讨论】:

  • 不应该是__weak QRCodeViewController *weakSelf = self;吗?
  • @Martin 任何一种都可以,它们是等效的,你的方式是我看到使用频率更高的方式,但 Andrea 的方式是 Apple 推荐的方式。
  • 类似问题:stackoverflow.com/questions/10431110/…。答案是部署目标设置为 4.0,但您的情况并非如此。对吗?
  • 你好,我的部署目标是>ios5 only。关于 Analog File 所写的语法,它们都给出了相同的警告。
  • 你是在外面使用它的块做这个,不是吗?

标签: objective-c ios automatic-ref-counting objective-c++ weak-references


【解决方案1】:

面对同样的警告,我通过以下方式使用 __block 属性使其消失:

__block __weak MyViewController* weakSelf = self;

【讨论】:

    【解决方案2】:

    我不确定为什么警告说不能指定 __weak。 AFAIK 应该可以指定它,即使将__weak 用于自动变量非常危险。

    Apple 文档说,如果您这样做,编译器会提供警告,但实际的警告文本似乎暗示该属性将被忽略,而不仅仅是使用它是危险的,而文档似乎暗示它是危险的但它按预期工作(如果您真的了解会发生什么)。

    您必须做一些实验来验证警告文本是否不合适或文档是否没有正确更新。

    【讨论】:

    • 嗨模拟文件,感谢您的回答,事实是,为您想要传递给块的对象创建弱引用以避免保留周期是正常的。我在我的代码中做了很多次,没有任何警告。我同意自动变量的弱是危险的,或者更好的是无意义的,因为当您将在块中用于异步进程时,该变量已经消失,因为它没有对它的强引用。但是在这里我分配的 self 不是一个自动变量,它被类本身的存在强引用。
    • 这不是废话。正如您所说,它具有完全合理的用例。但这很危险。您的异步块示例是正确的(很多人在理解它为什么不起作用时会遇到问题)。这就是苹果选择使其合法但发出警告的理由。如果您验证它有效,我想问题主要出在警告文本中,而不是您收到警告的事实(根据文档,这是编译器开发人员的有意识决定)。这也是为什么它只是一个警告,即使它被表述为错误。
    • @AnalogFile:您是否参考了 Apple 文档,据说如果 __weak 与自动变量一起使用,编译器会发出警告?谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    • 1970-01-01
    • 2015-09-24
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多