参考以下代码: #import <Foundation/Foundation.h> @interface Person : NSObject { int_age; int_weight; } @end @implementation Person @end int main() { Person*p = [Person new]; [pwalk]; return0; } 解析: 该段代码声明了一个名为Person的类,包含2个成员变量:_age、_weight,没有任何方法。 main函数中用Person类创建一个名为p的对象,并发送walk消息给对象p。 编译该段代码,产生如下警告: warning:’Person’ may not respond to ‘walk’ [pwalk]; 意即Person类可能不会响应walk消息。 链接过程无任何警告和错误。 运行编译连接产生的可执行文件,程序崩溃,产生以下错误: [Person walk]:unrecognized selector sent toinstance 0x76c767a698df 即:无法识别的消息被发送给实例对象 此现象即为OC弱语法,OC在运行时检测类的声明与实现是否完整,而不是在编译连接过程。以上代码编译链接能通过,但是运行时因为找不到walk方法的声明与实现,因此程序的运行时崩溃闪退。 以后写OC代码千万注意其弱语法带来的问题, 特别注意以下告警和错误: warning: ‘Class’ may not respond to ‘method’ error: unrecognized selector sent toinstance 以上告警和错误往往是由类的声明和实现不完整引起的,程序在编译链接或者运行时未能检测到正确的声明和实现;或者方法调用者身份与方法属性不符,比如用对象去调用类方法(无法通过对象找到类方法的实现);比如用类来调用对象方法(无法在类中找到对象方法的实现)。
|