今天继续练习,重新去理解一下动态识别的应用。平时我们经常判断一个对象是不是所属的类或者子类 ,可以通过is 的方法去完成。这个是swift提供的一个方法。oc则提供丰富的方式来判断,大部分功能集成在NSObject可见。可以说NSObject 责任非常重。
方法名 | 作用 |
---|---|
isMemberOfClass | 检测是不是某个类 |
isKindOfClass | 检测是不是某个类或者所属子类 |
respondsToSelector | 检测方法是否存在接受响应 |
isSubclassOfClass | 是否所属的子类 |
performSelector | 响应相应的方法 |
下面创建了三个类 分别为Animal(动物) Human(人类) 和Cat(猫) 类
它们的关系是
Cat 继承了Animal类
Human 则不继承Animal
定义相关的类
Animal.h定义
#import <Foundation/Foundation.h>
@interface Animal : NSObject
-(void) eat;
@end
实现动物
#import "Animal.h"
@implementation Animal
-(void) eat
{
NSLog(@"吃食物");
}
@end
实现人类
#import <Foundation/Foundation.h>
@interface Human : NSObject
//说话
-(void) say;
@end
#import "Human.h"
@implementation Human
-(void) say
{
NSLog(@"说话");
}
@end
猫类:
#import <Foundation/Foundation.h>
#import "Animal.h"
@interface Cat : Animal
@end
#import "Cat.h"
@implementation Cat
@end
实现代码
#import <Foundation/Foundation.h>
#import "Human.h"
#import "Animal.h"
#import "Cat.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSLog(@"Hello, World!");
//如何得到类对象
//1.可以通过类发送class 的消息
//2.可以通过实例对象 发送class的消息
//动态识别应用
Animal *animalA =[[Animal alloc]init];
Animal *animalB =[[Animal alloc]init];
Cat *cat =[[Cat alloc]init];
//判断两个类对象是不是一样?
if([animalA class]==[animalB class])
{
NSLog(@"通过实例对象获得类对象判断是一样的");
}
//对象是不是所属类对象成员,判断是不是属于某个类
if([animalA isMemberOfClass:[Animal class]])
{
NSLog(@"判断是所属Animal类");
}
//对象是不是所属类对象的成员或者子类的成员,判断是不是属于某个类或者子类,区别于isMemberOfClass方法
if([animalA isKindOfClass:[Human class]])
{
NSLog(@"判断是所属Animal类");
}
else
{
NSLog(@"判断不是所属Human类");
}
//判断是不是某个类的子类
if([Cat isSubclassOfClass:[Animal class]])
{
NSLog(@"Cat是Animal的子类");
}
//通过字符串 获取 类对象
Class myClass = NSClassFromString(@"Animal");
id animal =[[myClass alloc] init];//实例化对象
[animal eat];//采用动态类型去发送消息
//判断是否能响应指定的eat的方法
if([animal respondsToSelector:@selector(eat)])
{
[animal performSelector:@selector(eat)];
}
}
return 0;
}
在学习动态识别应用里面提及关于静态和动态的一些区别。我们常用的NSString、NSArray、NSInteger 发生一些错误等在编译期就能区别开来 这是编译器帮我们做的工作。
关于静态的好处是什么?
关于动态的优点和缺点又是什么?
这些知识,还是要继续区分一下才行。好,继续看书。
引用下面的一些观点
来自于成少雷的教学
1.可以将对象分为动态类型和静态类型两种
2.如果不涉及多态,尽量使用静态类型
3.静态类型可耕好的在编译阶段而不是运行阶段指出错误
4.静态类型能够提供程序的可读性。