A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 崔石炫 中级黑马   /  2014-9-21 17:38  /  1131 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

参考以下代码:
#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
以上告警和错误往往是由类的声明和实现不完整引起的,程序在编译链接或者运行时未能检测到正确的声明和实现;或者方法调用者身份与方法属性不符,比如用对象去调用类方法(无法通过对象找到类方法的实现);比如用类来调用对象方法(无法在类中找到对象方法的实现)。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马