【问题标题】:Why is it NOT a compiler error to specify a protocol but not implement required methods?为什么指定协议但未实现所需方法不是编译器错误?
【发布时间】:2011-09-19 21:32:09
【问题描述】:

在objective-c中,我可以做类似的事情

@interface MyViewController : UIViewController <UITextInputDelegate>

为实现 UITextInputDelegate 协议的 MyViewController 类创建规范。现在,这个协议有几个必需的方法,所以我认为编译器根本不会让代码编译,除非这些方法确实在 .m 文件中有实现。尽管如此,这是编译的。编译器确实会发出 warnings,所以很明显它检测到我没有实现所需的方法,但我想知道为什么在语言方面允许它完全编译是有意义的设计师。

【问题讨论】:

  • 代码编译并不意味着它不会崩溃。编译器会让各种错误通过。调试器就是您所追求的。

标签: objective-c


【解决方案1】:

无法编译代码时会出现编译器错误。不实现方法不会阻止代码被编译,因为 Objective-c 是一种动态语言。这意味着这些方法没有直接链接,因此在编译时不需要知道它们的位置。警告意味着在运行时可能会导致错误,但代码已成功编译。

【讨论】:

    【解决方案2】:

    正如 ughoavgfhw 指出的那样,这不是错误,因为该语言的动态特性允许在运行时添加这些方法。仅仅因为在编译时找不到该方法并不意味着它在运行时不会存在。

    【讨论】:

      【解决方案3】:

      如果您想将此警告转换为错误,只需将-Werror=protocol 添加到Other Warning Flags 中的Build Settings 中即可。

      【讨论】:

      • 这是有用的答案
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-22
      • 2020-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多