博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Objective-C之动态类型
阅读量:7103 次
发布时间:2019-06-28

本文共 2564 字,大约阅读时间需要 8 分钟。

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

判断对象类型

-(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 
@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判断是否是属于这类的实例,是否跟父类有关系他不管//yesif ([teaher isMemberOfClass:[Teacher class]]) {  NSLog(@"teacher Teacher类的成员");}   //noif ([teaher isMemberOfClass:[Person class]]) {  NSLog(@"teacher Person类的成员");}   //noif ([teaher isMemberOfClass:[NSObject class]]) {  NSLog(@"teacher NSObject类的成员");}

isKindOfClass

//2.isKindOfClass判断是否是其子类//yesif ([teaher isKindOfClass:[Teacher class]]) {  NSLog(@"teacher 是Teacher类或子类");}   //yesif ([teaher isKindOfClass:[Person class]]) {  NSLog(@"teacher 是Person类或子类");}   //yesif ([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];

转载地址:http://rfuhl.baihongyu.com/

你可能感兴趣的文章
WebService之Axis2(2):复合类型数据的传递
查看>>
SQL语句的JOIN的嵌套查询
查看>>
linux常用命令-nginx常用命令
查看>>
oracle网络
查看>>
OVR工厂简介
查看>>
callback 的时候在有些php版本下报出Unable to call custom function
查看>>
Python文件处理之文件写入方式与写缓存(三)
查看>>
zz MBR,EBR
查看>>
C#面向对象12 集合
查看>>
CF359D:Pair of Numbers(数论)
查看>>
Codeforces Round #562 (Div. 2) B. Pairs
查看>>
仿函数
查看>>
Javascript 视觉 逐帧动画(修正版)
查看>>
大学生很迷茫?给应届毕业生的八点建议。
查看>>
leetcode02大数相加
查看>>
新建Java Spring boot项目
查看>>
[读书笔记]机器学习:实用案例解析(1)
查看>>
[LeetCode] Integer to English Words
查看>>
Python中的装饰器——11
查看>>
thinkphp <eq> <if>标签 condition中可以写PHP的判断逻辑
查看>>