Objective-C之动态类型

模式星云
• 阅读 1707

对象在运行时获取其类型的能力称为内省。内省可以有多种方法实现。

判断对象类型

-(BOOL) isKindOfClass: classObj判断是否是这个类或者这个类的子类的实例
-(BOOL) isMemberOfClass: classObj 判断是否是这个类的实例

新建Person和Teacher类

Person

//
//  Person.h
//  DynamicType
//
//  Created by Michael on 2016/9/27.
//  Copyright © 2016年 Michael. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Person : NSObject {
    NSString *name;
}

-(void) setName:(NSString*) n;

@end

//
//  Person.m
//  DynamicType
//
//  Created by Michael on 2016/9/27.
//  Copyright © 2016年 Michael. All rights reserved.
//

#import "Person.h"

@implementation Person

-(void) setName:(NSString*) n {
    name = n;
}


@end

Teacher

//
//  Teacher.h
//  DynamicType
//
//  Created by Michael on 2016/9/27.
//  Copyright © 2016年 Michael. All rights reserved.
//

#import "Person.h"

//继承Person
@interface Teacher : Person

-(void) teach;

@end

//
//  Teacher.m
//  DynamicType
//
//  Created by Michael on 2016/9/27.
//  Copyright © 2016年 Michael. All rights reserved.
//

#import "Teacher.h"

@implementation Teacher

-(void) teach {
    NSLog(@"%@教数学",name);
}
@end

isMemberOfClass

Person *person = [[Person alloc] init];
Teacher *teaher = [[Teacher alloc] init];
      
//1.isMemberOfClass判断是否是属于这类的实例,是否跟父类有关系他不管
//yes
if ([teaher isMemberOfClass:[Teacher class]]) {
  NSLog(@"teacher Teacher类的成员");
}
   
//no
if ([teaher isMemberOfClass:[Person class]]) {
  NSLog(@"teacher Person类的成员");
}
   
//no
if ([teaher isMemberOfClass:[NSObject class]]) {
  NSLog(@"teacher NSObject类的成员");
}

isKindOfClass

//2.isKindOfClass判断是否是其子类
//yes
if ([teaher isKindOfClass:[Teacher class]]) {
  NSLog(@"teacher 是Teacher类或子类");
}
   
//yes
if ([teaher isKindOfClass:[Person class]]) {
  NSLog(@"teacher 是Person类或子类");
}
   
//yes
if ([teaher isKindOfClass:[NSObject class]]) {
  NSLog(@"teacher 是NSObject类或子类");
}

判断对象方法

-(BOOL) respondsToSelector: selector 判读实例是否有这样方法
+(BOOL) instancesRespondToSelector: 判断类是否有这个方法。此方法是类方法,不能用在类的对象

respondsToSelector

//3.respondsToSelector判断示例是否有这个方法
   
if ([teaher respondsToSelector:@selector(setName:)]) {
  NSLog(@"有此方法");
}
   
if ([teaher respondsToSelector:@selector(setAge)] == NO) {
  NSLog(@"无此方法");
}

instancesRespondToSelector

//4.instancesRespondToSelector判断类中是否有该方法,不能用在类的对象
   
if ([Person instancesRespondToSelector:@selector(setName:)]) {
  NSLog(@"Person 有此方法");
}
   
if ([Teacher instancesRespondToSelector:@selector(teach)]) {
  NSLog(@"Teacher 有此方法");

}
   
if ([Teacher instancesRespondToSelector:@selector(setName:)]) {
  NSLog(@"Teacher 有此方法");
  
}

Objective-C的id类型

在 Objective-C 中,id类型类似于(void*) ,可以指向任何类的实例。而不需要强制转换。

Teacher *teaher = [[Teacher alloc] init];
id t = teaher;  //id指向Teacher类
[t setName:@"liuguoquan"];
[t teach];
点赞
收藏
评论区
推荐文章
Dax Dax
4年前
js高频手写大全
1.手写instanceofinstanceof作用:判断一个实例是否是其父类或者祖先类型的实例。instanceof在查找的过程中会遍历左边变量的原型链,直到找到右边变量的prototype查找失败,返回false2.实现数组的map方法3.reduce实现数组的map方法4.手写数组的reduce方法reduce()方法接收一个函数作为累
Wesley13 Wesley13
3年前
java中 什么是反射?
JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言(https://www.oschina.net/act
晴空闲云 晴空闲云
3年前
JavaScript中isPrototypeOf函数详解
有时看一些框架源码的时候,会碰到isPrototypeOf()这个函数,那么这个函数有什么作用呢?isPrototypeOf()isPrototypeOf()是Object函数(类)的下的一个方法,用于判断当前对象是否为另外一个对象的原型,如果是就返回true,否则就返回false。这个函数理解的关键是在原型链上,这个据说是JavaScript
Wesley13 Wesley13
3年前
java中多态的实现机制
多态的概念:  简单来说就是事物在运行过程中存在的不同状态,即父类或接口定义的引用变量指向子类或具体实现类的实例对象。程序调用方法在运行期才进行动态绑定,而不是引用变量的类型中定义的方法。多态存在的前提:1、存在继承关系,子类继承父类;2、子类重写父类的方法;3、父类引用指向子类对象。具体实例:1、定义一个父类:Animal
Wesley13 Wesley13
3年前
java中字符串相等判断
字符串的判断有2种:        1、判断地址是否相等 用:        2、判断值是否相等 用:equals方法Object类作为所有类的超类,而Object类的equals方法是直接比较地址的,源码如下:publicbooleanequals(Objectobj){
Wesley13 Wesley13
3年前
java面试(反射)05
1.什么是反射JAVA反射机制是在运行状态中,对于任意一个类,都能够获取这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取类信息以及动态调用对象内容就称为java语言的反射机制。2.反射的作用在运行时判断任意一个对象所属的
Wesley13 Wesley13
3年前
java中经常问到的面试题
1、面向对象编程的三大特性是什么?(1).继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例
Wesley13 Wesley13
3年前
Java泛型的使用
泛型的定义:泛型,就是允许在定义类、接口时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。这个类型参数将在使用时(例如,继承或实现这个接口,用这个类型声明变量、创建对象时)确定(即传入实际的类型参数,也称为类型实参)。泛型的引入背景:集合容器类在设计阶段或声明阶段不能确定这个容器到底实际存储的是什么类型的对象
Stella981 Stella981
3年前
PythonStudy——魔法函数 Magic Methods
魔法函数python中以双下划线开始和结束的函数(不可自己定义)为魔法函数调用类实例化的对象的方法时自动调用魔法函数(感觉不需要显示调用的函数都叫)在自己定义的类中,可以实现之前的内置函数,比如下面比较元素sorted时用It函数(lt(self,other):判断self对象是否小于other对象;)
Wesley13 Wesley13
3年前
Java反射机制及适用场景
什么是Java反射机制?JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的以及动态调用对象的方法的功能称为Java的反射机制。反射的适用场景是什么?1.当你做一个软件可以安装插件的功能,你连插件的类型名称都不知道,你怎么实例化这个对象呢
Stella981 Stella981
3年前
C#中Activator.CreateInstance()方法用法分析
本文实例讲述了C中Activator.CreateInstance()方法用法。Activator类包含特定的方法,用以在本地或从远程创建对象类型,或获取对现有远程对象的引用。C在类工厂中动态创建类的实例,所使用的方法为:1.Activator.CreateInstance(Type)2.Activator.