如何忽略“为X无可见@interface声明选择”?(How to ignore “No visib

2019-08-03 00:22发布

ARC之前,我有一个“X可能不响应XXX” 的警告 ,这是一个相当无害的警告,这并不妨碍它的编译。 现在,我想我的项目转换为ARC,我有一个“为X无可见@interface声明选择xxx”的错误 ,它禁止编译。

我知道我在做什么,为什么警告在那里,我可以告诉你该程序是正确的。 此前,编译器没有问题编译它,不应该从现在编译停止。

的确,X类的接口不声明选择,但X与任何选择发送给它,使用动态地处理任何消息类forwardInvocation:即约Objective-C的美好事物之一),所以它的界面不可能所有的声明,可以在它被称为选择。 并且选择某处声明,只是没有上X.

Answer 1:

我知道我在做什么,为什么警告在那里,我可以告诉你该程序是正确的。

OK -只需使用objc_msgSend等。 直接,如果你想要做的编译器的工作。

的确,X类的接口不声明选择,但X与任何选择发送给它,使用forwardInvocation动态地处理任何消息类:(即约Objective-C的美好事物之一),所以它的界面不可能所有的声明,可以在它被称为选择。 并且选择在某处声明,只是没有上X.

如果它太繁琐的申报,但没有足够繁琐的消息,似乎违背了你的程序使用选择的使用......听起来像的生成代码显著人为干预的危险地带。

也许你应该考虑宣布的协议,因此编译器至少可以设置邮件调用正确的你 - 如果你改变或打破的东西,它有机会调整或通知您。



Answer 2:

我不能肯定,但我相信在ARC其编译器可以看到一个方法签名,因为它需要知道什么是需要的内存管理更重要。 所以,你要么需要:

  1. 声明您是通过正常的方法之一使用方法(即理想的实际接收器,但如果没有别的作为一个类别,即使只在NSObject )。
  2. 做事情通过手动NSInvocation或一些其他类似的手段,考虑内存管理的全部责任(这可能会非常棘手,因为你必须弥合,并从ARC)。

更新 :我刚刚检查铛源,这确实是这样的-它使用ARC时需要签名。 它不只是想平均值。 :)



Answer 3:

的确,X类的接口不声明选择,但X与任何选择发送给它,使用forwardInvocation动态地处理任何消息类:(即约Objective-C的美好事物之一),所以它的界面不可能所有的声明,可以在它被称为选择。 并且选择在某处声明,只是没有上X.

如果你想放弃的静态类型信息投射到ID。 或者,如果你的对象是另一个类的代理,也许投下的那类。

只要方法在头(是的情况下无论如何这需要)宣布的地方,并且存在与参数类型没有歧义,这应该修正这个错误。

如果你有兴趣,为什么这仅是启用ARC的问题,请检查回答这个问题,我问: 为什么是“为选择X没有已知的方法” ARC下硬错误?



文章来源: How to ignore “No visible @interface for X declares the selector”?