我经常发现,当从 myObject2 调用与 myObject1 关联的 myMethod 时,我收到“myObject1 可能无法响应 -myMethod”的警告,但随后程序运行得很好。为什么编译器在编译时不能识别声明的方法?
约翰·多纳
我经常发现,当从 myObject2 调用与 myObject1 关联的 myMethod 时,我收到“myObject1 可能无法响应 -myMethod”的警告,但随后程序运行得很好。为什么编译器在编译时不能识别声明的方法?
约翰·多纳
这显示为警告,因为 Objective-C 是一种非常动态的语言。在编译时,编译器在尝试编译文件时没有找到“myMethod”的声明(可能您缺少头文件,或者忘记将其包含在头文件中?)。然而,它只产生了一个警告,因为 Objective-C 有能力在运行时创建和加载额外的方法,这样当代码执行时,该方法就会存在。因此,这只是一个警告。
很可能您只是没有在适当的头文件中声明该方法。
警告意味着您正在调用编译器尚未看到方法声明的方法。在大多数其他语言中,这是一个错误,这当然是一个你不能忽视的警告。
如果您尚未声明该方法,请在源文件顶部的 @interface 块中(如果它是私有方法)或类的头文件(如果它是公共方法)中声明。
如果您在头文件中声明了方法,请务必导入头文件。
如果您已经声明了该方法并且您正在导入正确的头文件,那么您在某处有错字。
或者有时,如果您使用的是委托类,则需要使用这些委托方法定义一个类别,以便编译器找到它们。
这种情况经常发生的一种情况是,如果包含对象的变量的类型是超类的类型,并且该方法只为子类定义。您可以通过将其键入为id
或使静态类型更具体来避免这种情况。如果变量类型是类本身的类型,则该方法很可能在您尝试调用它的范围内对编译器不可见 - 其他答案处理这种情况。