【问题标题】:Objective-C - Avoid compile error?Objective-C - 避免编译错误?
【发布时间】:2013-01-15 16:41:48
【问题描述】:

有没有办法抑制编译错误? 在这种情况下,我无法使用协议,因为我尝试使用的类位于外部库中。我无法控制代码

if (myClass && [[myClass class] respondsToSelector:@selector(getSomething)])
{
   // Compile error on the line below
   MyResult *result = [myClass getSomething];

   // Also tried
   MyResult *result = [(id)myClass getSomething];

}

编辑: 错误:没有已知的选择器类方法

【问题讨论】:

  • GDB 和 LLDB 是调试器,而不是编译器。 Apple 支持的编译器是 GCC 和 Clang。
  • lldb & gdb 和编译有什么关系?除此之外,还有什么错误?
  • 你遇到了什么错误?
  • 编译器不知道您尝试使用的类方法。你#import 找对文件了吗?
  • @zneak 但是这个类可以是任何东西,我想在任何响应它的类上调用那个方法

标签: objective-c compiler-errors compiler-warnings


【解决方案1】:

当您在无类型的 Objective-C 对象上使用方法时,编译器会尝试根据其选择器猜测您尝试调用的方法,因为它需要根据返回值生成不同的代码。生成代码的方式也会因你是否使用ARC而有所不同,编译器也需要相应地改变。

如果没有 ARC,编译器将假定其不知道的任何选择器的返回类型为 id,并生成警告。使用 ARC,它变成了一个硬错误,因为编译器不想在内存管理上冒险。

这就是为什么您至少需要告诉编译器该方法的一个现有声明。

【讨论】:

  • 另一种解决方案是使用方法声明一个类别; @interface SomeClass (MethodsThatExistThatAreNotDeclaredThisIsBadCodeAndIFeelBad) decl @end 位于需要它的 .m 文件的顶部。
【解决方案2】:

本文介绍了如何使用#pragma 声明来避免在您确定警告是误报(或您认为可以安全忽略的警告)的情况下出现编译器警告:NSHipster - #pragma

【讨论】:

  • 在这种情况下它不是误报。
  • 是的。我添加了一个括号来阐明我的意图。
猜你喜欢
  • 1970-01-01
  • 2016-08-19
  • 1970-01-01
  • 2016-03-23
  • 2019-05-03
  • 2012-10-06
  • 2014-01-19
  • 1970-01-01
  • 2012-07-10
相关资源
最近更新 更多