Objective-C自动引用计数(ARC)中__weak变量的引用会触发警告:“无法在自动变量上指定__weak属性”。

6

我有一个应用程序(仅限 iOS5),其中在一个方法内声明了一个弱变量,该变量在块中使用以引用视图控制器的实例。

 QRCodeViewController * __weak weakSelf = self;

问题在于编译器显示了一个警告信息:
__weak属性不能被指定在自动变量上
在这个应用程序中,我使用了很多弱引用,但从未见过像这样的警告。唯一不同之处就是这个类是在.mm文件中实现的,因为它使用了C++对象,如果我将其保留为.m文件,则无法编译项目。
我必须说代码似乎可以正常工作。
有什么建议吗?

2
@Martin 两种方式都可以,它们是等效的。我更经常看到你的方式使用,但Andrea的方式是Apple推荐的方式。 - Analog File
类似的问题:https://dev59.com/3mPVa4cB1Zd3GeqP5Wng。那里的答案是部署目标设为4.0,但在你的情况下不是这样吗? - Ben Clayton
你好,我的部署目标仅限于iOS5以上版本。关于语法,正如Analog File所写,它们都会产生相同的警告。 - Andrea
你是在使用它的代码块之外进行操作,对吧? - Abizern
是的,它在块的定义之外。.h文件中声明的所有属性都是(strong, nonatomic),而.m文件中声明的属性也是(strong, non atomic)。谢谢。 - Andrea
显示剩余2条评论
2个回答

4
面对这个警告,我使用 __block 属性来消除它,方法如下:
__block __weak MyViewController* weakSelf = self;

0

我不确定为什么警告会说无法指定__weak。据我所知,即使对于自动变量使用__weak非常危险,也应该可以指定它。

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

您需要进行一些实验来验证警告文本是否不适当或文档是否未正确更新。


嗨,Analog File,感谢您的回答。事实上,为了避免保留循环,为要传递给Block的对象创建弱引用是很正常的。我在我的代码中已经做了很多次,没有任何警告。我同意,对于自动变量来说,弱引用是危险的,或者更好的说是没有意义的,因为当您将其用于异步进程的块时,该变量已经不存在了,因为它没有强引用。但是,在这里,我正在分配self,它不是自动变量,并且由类本身的存在强引用。 - Andrea
这不是胡说八道。正如你所说,它有完全合理的用例。但它很危险。你的异步块示例非常准确(很多人会遇到理解为什么它不起作用的问题)。这就是苹果选择使其合法但仍然发出警告的原因。如果您已经验证了它的工作,我想问题主要在于警告文本,而不是您收到警告的事实(根据文档,这是编译器开发人员的有意决定)。这也是为什么它只是一个警告,即使它被措辞为错误。 - Analog File
1
@AnalogFile:你有苹果文档的参考资料吗?其中说到如果__weak与自动变量一起使用,编译器会发出警告。谢谢! - Martin R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接