Objective c 为什么指定协议而不实现所需的方法不是编译器错误?

Objective c 为什么指定协议而不实现所需的方法不是编译器错误?,objective-c,Objective C,在objective-c中,我可以这样做 @interface MyViewController : UIViewController <UITextInputDelegate> @接口MyViewController:UIViewController 为实现UITEPutDelegate协议的类MyViewController创建规范。现在,这个协议有几个必需的方法,所以我认为编译器根本不会让代码编译,除非那些方法实际上在.m文件中有实现。尽管如此,这是编译的。编译器确实会发出

在objective-c中,我可以这样做

@interface MyViewController : UIViewController <UITextInputDelegate>
@接口MyViewController:UIViewController

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

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

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

如果要将此警告变成错误,只需在
生成设置中的
-Werror=protocol
中添加
其他警告标志


代码编译并不意味着它不会崩溃。编译器将允许各种错误通过。调试器就是你想要的。这是一个有用的答案