OC动态性

OC基于动态运行时类型,而C++基于静态类型,也就是说用OC编译测程序不能直接编译成可令机器读懂的机器语言(二进制编码),而是在程序运行时(Runtime)把程序编译成令机器读懂的机器语言;用C++编写测程序,编译时就直接编译成了可令机器读懂的机器语言。这就是为什么把OC视为一门动态开发语言的原因。

 

1.首先是Class类型:

Class class = [NSObject class]; // 通过类名得到对应的Class动态类型
Class class = [obj class]; // 通过实例对象得到对应的Class动态类型
if([obj1 class] == [obj2 class]) // 判断是不是相同类型的实例
2.Class动态类型和类名字符串的相互转换:

NSClassFromString(@”NSObject”); // 由类名字符串得到Class动态类型
NSStringFromClass([NSObject class]); // 由类名的动态类型得到类名字符串
NSStringFromClass([obj class]); // 由对象的动态类型得到类名字符串
3.判断对象是否属于某种动态类型:

-(BOOL)isKindOfClass:class // 判断某个对象是否是动态类型class的实例或其子类的实例
-(BOOL)isMemberOfClass:class // 与isKindOfClass不同的是,这里只判断某个对象是否是class类型的实例,不放宽到其子类
4.判断类中是否有对应的方法:

-(BOOL)respondsTosSelector:(SEL)selector // 类中是否有这个类方法
-(BOOL)instancesRespondToSelector:(SEL)selector // 类中是否有这个实例方法
区别: 
上面两个方法都可以通过类名调用,前者判断类中是否有对应的类方法(通过‘+’修饰定义的方法),后者判断类中是否有对应的实例方法(通过‘-’修饰定义的方法)。此外,前者respondsTosSelector函数还可以被类的实例对象调用,效果等同于直接用类名调用后者instancesRespondToSelector函数。 
举个例子:假设有一个类Test,有它的一个实例对象test,Test类中定义了一个类函数:+ (void)classFun;和一个实例函数:- (void)objFunc;,那么各种调用情况的结果如下:

    [1][Test instancesRespondToSelector:@selector(objFunc)];//YES
    [2][Test instancesRespondToSelector:@selector(classFunc)];//NO

    [3][Test respondsToSelector:@selector(objFunc)];//NO
    [4][Test respondsToSelector:@selector(classFunc)];//YES

    [5][test respondsToSelector:@selector(objFunc)];//YES
    [6][test respondsToSelector:@selector(classFunc)];//NO

结论: 如果想判断一个类中是否有某个类方法,应该使用[4]; 如果想判断一个类中是否有某个实例方法,可以使用[1]或者[5]。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值