当前位置:网站首页>【动态类型检测 Objective-C】
【动态类型检测 Objective-C】
2022-08-05 06:20:00 【清风清晨】
前言
1 ) Objective-C中的编译器叫什么名字,LLVM,它可以编译C语言,Objective-C语言,Swift语言,C++语言。
2)编译器在编译的时候,判断1个指针是否可以调用指向的对象的方法,它的判断准则,就是那个指针类型,
所以,这个时候,我们可以很轻松的把编译器给骗过:
NSString *str = @“jack”;
[str sayHi];
好,我们说,这时候编译器会报错吧!我们想把编译器骗过,怎么骗过,是不是把它强转成Person *类型啊?
[(Person *)str sayHi];
这时候,编译器就不会报错了。
3)就算骗过了编译器,它还会再做运行检查。
所以,我们写的程序,就算编译通过了,不意味着可以完美的执行!
4)所以,能不能在执行sayHi();方法之前,我自己先判断一下,这个str指针指向的对象里面,到底有没有sayHi();方法
如何写代码,来先判断一下,对象当中是否有这个方法,如果有,再去执行,如果没有,就别去执行了。这样就可以避免,由于没有方法,而报错吧!
一、怎么判断有没有这个方法呢?
1)判断指针指向的对象中,是否有这个方法可以执行。
语法:
Person *p1 = [Person new];
[p1 respondsToSelector:@selector(sayHi)];
它就会帮我判断,p1对象能否响应这个sayHi方法,言下之意,就是,它会去判断,p1对象里面,到底有没有这个sayHi方法。
返回值什么类型的,BOOL
BOOL b1 = [p1 respondsToSelector:@selector(sayHi)];
如果返回的是YES,这个时候,我是不才去调啊?
if(b1 == YES)
{
[p1 sayHi];
}
如果是length方法呢?
BOOL b1 = [p1 respondsToSelector:@selector(length)];
if(b1 ==YES)
{
[p1 sayHi];
}
else
{
NSLog(@“NO…”);
}
–(BOOL)respondsToSelector:(SEL);
二、isKindOfClass方法
1.语法
– (BOOL)isKindOfClass:(Class)aClass;
1)这个方法什么意思:
判断一个对象,是不是一个指定类的实例,或者说这个指定类的子类的实例。
例如:[p1 isKindOfClass:[Person class]];
BOOL b2 = [p1 isKindOfClass:[Person class]];
NSLog(@“b2= %d”,b2);//答案是1
如果是NSObject呢?
BOOL b2 = [p1 isKindOfClass:[NSObject class]];
NSLog(@“b2= %d”,b2);//答案还是1
如果是NSString ,答案就是0
如果说Student,答案是0
如果是:
Student *s1 = [Student new];
BOOL b2 = [s1 isKindOfClass:[Student class] ];
NSLog(@“b2 = %d”,b2);//答案是1
如果是:
Student *s1 = [Student new];
BOOL b2 = [s1 isKindOfClass:[Person class] ];
NSLog(@“b2 = %d”,b2);
判读s1是不是Person对象,或者是不是Person的子类对象
2.isMemberOfClass
– (BOOL)isMemberOfClass:(Class)class;
例如:
Student *s1 = [Student new];
BOOL b2 = [s1 isMemberOfClass:[Person class]];
NSLog(@“b2 = %d”,b2);
答案是0
例如:
Student *s1 = [Student new];
BOOL b2 = [s1 isMemberOfClass:[Student class]];
NSLog(@“b2 = %d”,b2);
答案是1
isMemberOfClass的作用,是判断s1对象是不是一个Student对象,
记住,不包括它的子类。
只能判断本类,不包括子类。
判断对象是否为指定类的对象,不包括子类。
isSubclassOfClass
++(BOOL)isSubclassOfClass:(Class)aClass;
判断指定的类,是不是另外一个类的子类
例如:
BOOL b3 = [Student isSubclassOfClass:[Person class]];
NSLog(@“b3 = %d”,b3);
答案是1
判断Student类,是不是Person类的子类。
以上,就是动态类型检测的4个方法,最常用的就是:
–(BOOL)respondsToSelector:(SEL)aSelector;这个方法
我们在调用一个对象方法之前,一般都会先判断这个对象里面到底有没有这个对象方法。
那如果,我创建的对象就是一个
Person对象,我还有必要判断一下这个对象里有没有sayHi方法吗,没有!
那这个respondsToSelector使用在哪里?
我们后面,去调用别人写的方法,那个方法就会返回一个对象给我,那这个时候,你可能就不知道这个对象到底是个什么对象了,它可能返回是个id类型的,那这个对象里面到底有没有这个方法呢,所以,你在调之前,最好先干嘛,去判断一下!
记住,这个respondsToSelector只能判断对象方法,就是这个对象里面有没有这个对象方法;
那我要判断类里面有没有这个类方法呢,用:
BOOL b4 = [Student instancesRespondToSelector:@selector(sayHi)];
NSLog(@“b4 = %d”,b4);
它就会判断Student这个类里面,有没有sayHi这个类方法
++ (BOOL)instancesRespondToSelector:(SEL)aSelector;
判断类中,是否有指定的类方法。
边栏推荐
猜你喜欢
随机推荐
文件内音频的时长统计并生成csv文件
Redis
DNSlog外带数据注入
Unable to import torchvision. IO. Read_image
Writing OpenCV in VSCode
Nacos cluster construction
2022杭电多校六 1006-Maex (树形DP)
Mysql主从延迟的原因和解决方案
unity 将Text批量替换为TextMeshProUGUI
【JVM调优】Xms和Xmx为什么要保持一致
技术分析模式(十一)如何交易头肩形态
Hong Kong International Jewellery Show and Hong Kong International Diamond, Gem and Pearl Show kick off
香港国际珠宝展及香港国际钻石、宝石及珍珠展揭幕
【MyCat简单介绍】
盒子模型中过度约束问题及其解决办法
VS Code私有服务器部署(私有化)
(JLK105D)中山爆款LED恒流电源芯片方案
Tips for formatting code indentation
基于快速行进平方法的水面无人船路径规划
七夕!专属于程序员的浪漫表白









