iOS 动态类型isKindOfClass, isMemberOfClass 初认识

【iOS】isKindOfClass和isMemberOfClass方法 这个归根结底还是在考察我们对isa走向图和类的继承的理解,也就是苹果官方这幅图:接下来的函数调用流程请参考这张图。 阅读详情

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

这些知识是看别的博主写的,然后自己理解再写一遍。

新建两个类,Person,Teacher。Teacher继承与Person。

1.Person类

//
//  Person.h
//  iOS动态类型
//
//  Created by 987trip_dev_mac on 15/6/16.
//  Copyright (c) 2015年 987trip_dev_mac. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Person : NSObject
@property (nonatomic, strong) NSString *name;
-(void)setName:(NSString *)name;
@end

//
//  Person.m
//  iOS动态类型
//
//  Created by 987trip_dev_mac on 15/6/16.
//  Copyright (c) 2015年 987trip_dev_mac. All rights reserved.
//

#import "Person.h"

@implementation Person

-(void)setName:(NSString *)name{
    
    
    self.name = name;
    
}
@end


2.新建Teacher类

//
//  Teacher.h
//  iOS动态类型
//
//  Created by 987trip_dev_mac on 15/6/16.
//  Copyright (c) 2015年 987trip_dev_mac. All rights reserved.
//

#import "Person.h"

@interface Teacher : Person

-(void)teach;
@end

//
//  Teacher.m
//  iOS动态类型
//
//  Created by 987trip_dev_mac on 15/6/16.
//  Copyright (c) 2015年 987trip_dev_mac. All rights reserved.
//

#import "Teacher.h"

@implementation Teacher
-(void)teach{
    
    NSLog(@"我是教数学的");
}
@end

3.Students类

//
//  Students.h
//  iOS动态类型
//
//  Created by 987trip_dev_mac on 15/6/16.
//  Copyright (c) 2015年 987trip_dev_mac. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Students : NSObject
-(void)learning;
@end

//
//  Students.m
//  iOS动态类型
//
//  Created by 987trip_dev_mac on 15/6/16.
//  Copyright (c) 2015年 987trip_dev_mac. All rights reserved.
//

#import "Students.h"

@implementation Students
-(void)learning{

    
    NSLog(@"我是学生,我爱学习");
    
}
@end



在控制器上实例化

/**
        Person,Teacher这两个类。Teacher是继承与Person。
     */
    Person *person = [[Person alloc]init];
    Teacher *teacher = [[Teacher alloc]init];



判断对象类类型

- (BOOL)isKindOfClass:(Class)aClass;isKindOfClass是检测属不属于这个类的子类。就算是继承都是可以检测出来

- (BOOL)isMemberOfClass:(Class)aClass;isMemberOfClass判断是否是属于这类的实例,是否跟父类有关系他不管。

/**
        Person,Teacher这两个类。Teacher是继承与Person。
     */
    Person *person = [[Person alloc]init];
    Teacher *teacher = [[Teacher alloc]init];
    
    //isMemberOfClass方法。
    if ([teacher isMemberOfClass:[Teacher class]]) {
        
        NSLog(@"teacher Teacher类的成员");
    }
    
    if ([teacher isMemberOfClass:[Person class]]) {
        NSLog(@"teacher Person类的成员");
    }
    
    if ([teacher isMemberOfClass:[NSObject class]]) {
        
        NSLog(@"teacher NSObject类的成员");
    }
    //只有第一个判断打印出来,isMemberOfClass判断是否是属于这类的实例,是否跟父类有关系他不管。
    
    //isKindOfClass方法
    if ([teacher isKindOfClass:[Teacher class]]) {
        
        NSLog(@"teacher 是 Teacher类或Teacher的子类");
    }
    
    if ([teacher isKindOfClass:[Person class]]) {
        NSLog(@"teacher 是 Person类或Person的子类");
    }
    
    if ([teacher isKindOfClass:[NSObject class]]) {
        
        NSLog(@"teacher 是 NSObject类或NSObject的子类");
    }
    // isKindOfClass 是检测属不属于这个类的子类。就算是继承都是可以检测出来

判断实例是否有这个方法

- (BOOL)respondsToSelector:(SEL)aSelector;判断实例是否有这样方法

if ([person respondsToSelector:@selector(setName:)]==YES) {
        
        NSLog(@"Person 有这个方法 setName");
        
    }
    if ([Teacher respondsToSelector:@selector(alloc)]==YES) {
        
        NSLog(@"Teacher 有这个方法 alloc");
        
    }

+ (BOOL)instancesRespondToSelector:(SEL)aSelector;判断类是否有这个方法。此方法是类方法,不能用在类的对象

 if ([Person instancesRespondToSelector:@selector(teach)]==YES) {
        
        NSLog(@"Person 有这个方法 ");
    }
    
    if ([Teacher instancesRespondToSelector:@selector(teach)]==YES) {
        
        NSLog(@"Teacher 有这个teach方法");
    }
    
    if ([Teacher instancesRespondToSelector:@selector(setName:)]==YES) {
        
        NSLog(@"Teacher 有这个setName方法");
    }


1. NSClassFromString

  这个方法判断类是否存在,如果存在就动态加载的,不存为就返回一个空对象;

  优点:

1, 弱化连接,因此并不会把没有的Framework也link到程序中。

2,不需要使用import,因为类是动态加载的,只要存在就可以加载。因此如果你的toolchain中没有某个类的头文件定义,而你确信这个类是可以用的,那么也可以用这种方法。

//动态加载实例
    //NSClassFromString(<#NSString *aClassName#>)
    //这个方法判断类是否存在,如果存在就动态加载的,不存为就返回一个空对象;
    
    id student = [[NSClassFromString(@"Students") alloc]init];
    if ([student isMemberOfClass:[NSClassFromString(@"Students") class]]) {
        
        NSLog(@"存在 Students 这个类");
    }
    
    //等价于
    id students = [[Students alloc]init]



NSSelectorFromString

 这个方法是上个方法的补充,也是动态加载实例方法。

//动态加载实例的方法
    SEL sel = NSSelectorFromString(@"learning");
    if ([student respondsToSelector:sel]) {
        
        [student performSelector:sel withObject:student];
        NSLog(@"存在这个方法");
    }










iOS经典面试题之深入解析类Class的iskindOfClass与isMemberOfClass的底层原理 isa 指针的作用 对象的isa指向类,类的isa指向元类(meta class),元类isa指向元类的根类,isa 帮助一个对象找到它的方法; isa 是一个Class 类型的指针. 每个实例对象有个isa的指针,他指向对象的类,而C lass 里也有个isa的指针, 指向 meteClass(元类),元类保存了类方法的列表。 当类方法被调用时,先会从本身查找类方法的实现,如果没有,元类会向他父类查找该方法。 同时注意的是:元类(meteClass)也是类,它也是对象。元类也有isa指针,它的isa指针 阅读详情

相关推荐

Windows下用MSYS2一键搞定Verilator安装(附国内镜像加速)

本文详细介绍了在Windows系统下,如何利用MSYS2工具和国内镜像源,快速、高效地完成Verilator的安装与配置。通过替换清华镜像源加速下载,并配合Pacman包管理器,实现近乎一键式的安装流程,有效解决了传统方法步骤繁琐、网络依赖下载慢的问题,为数字电路仿真提供了便捷的Windows环境解决方案。

weixin_29208327的博客 592

iOS学习:isKindOfClass & isMemberOfClass

iOS中isKindOfClass和isMemberOfClass的区别

qq_45424937的博客 1792

AI人工智能与模拟退火:碰撞出的智慧火花

本文旨在为读者全面介绍模拟退火算法在人工智能领域的应用。我们将涵盖从基础理论到实际实现的完整知识体系,帮助读者理解这一受自然界启发的优化技术如何解决复杂的计算问题。文章首先介绍模拟退火的基本概念,然后深入其工作原理和数学基础,接着通过Python实现展示具体应用,最后讨论实际应用场景和未来发展方向。模拟退火(Simulated Annealing, SA):一种受物理退火过程启发的概率性优化算法能量函数(Energy Function):评估系统状态的函数,对应优化问题的目标函数。

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 452

【iOS】——探究isKindOfClass和isMemberOfClass底层实现

判断该对象是否为传入的类或其子类的实例 分为类方法和实例方法,相同点都是首先判断调用者的isa指针指向的对象是否和传入的cls对象相同,如果不相同则沿着继承链获取调用者的父类的isa指针接着判断其指向的对象和传入的cls对象相同。如果相同则返回YES,否则一直沿着继承链找直到tcls为nil退出循环并返回NO。至于tcls为什么能为nil呢,因为任何OC对象沿着继承链向上都会到根类NSObject类而NSObject类的Superclass为nil说完了相同点下面说下不同点,在OC中实例对象的isa指针指向

m0_73974920的博客 1675

【CTF-misc】java盲水印BlindWatermark工具使用

​ 盲水印是一种肉眼不可见的水印方式,对图片资源使用图片盲水印或者文字水印,借此避免数字媒体未经授权的复制和拷贝,可通过对原图进行解码操作,得到水印图来证明版权归属。 题目来源:NewStarCTF 2023 公开赛道 WEEK2|MISC:Jvav

qq_39972370的博客 6446

FPGA_adc采样并通过以太网发送到上位机

本项目使用FPGA-ZYNQ-7020采集8通道ADC数据,通过以太网上传到上位机显示波形PL部分包括数据的获取与处理,数据从PL传递到PSPS部分包括以太网的发送,由PL到PS的中断触发本文章不详细讲解背后原理 但保证每一步足够详细,跟着就能实现。本人FPGA平台 大磊FPGA7020开发板 vivado2020.2 vitis2020.2 匿名上位机公开版

weixin_42304868的博客 5626

isKindOfClass:[类名 class]

【类 class】Class就是一个变量的类型//cls就是一个变量,里面存放的是类的名字 //静态的方法来获取一个类的名字 Class cls =[NSString class];//【有用】 NSLog(@"%@",cls); //动态的方法来获取一个类的名字 Class cls2 = NSClassFromString(@"NSArray"); NSLog(@"%@",cls2); //使用特

遇见更好的自己 773

多任务学习中的过拟合陷阱:动态停止训练机制详解与避坑指南

本文深入剖析了多任务学习中因任务过拟合不同步导致的性能下降问题,并详细介绍了动态停止-继续训练机制。该机制通过为每个任务设置独立的训练开关,基于验证集性能动态控制其梯度更新,有效缓解了任务间负迁移,是提升多任务模型整体泛化能力的关键策略。

happy2的博客 1092

【iOS】isMemberOfClass&isKindOfClass

对NSObject API中的两个方法 isKindOfClass 和 isMemberOfClass 的实现进行了分析,分别从底层源码和调用结果两个角度验证

XY_Mckevince的博客 1811

EU 2021/646 eCall工程拆解:MSD、测试模式与型式核准

紧急呼叫系统(eCall)是车载通信中面向事故救援的安全功能,其原理是在碰撞或人工触发后,通过蜂窝网络向公共安全应答点发送最小数据集(MSD),并建立语音链路。技术价值在于缩短救援响应时间、提升事故后生存率,应用场景覆盖乘用车、轻型商用车及车载T-Box等前装通信模块。面向欧盟市场时,EU 2021/646把eCall从安装要求推进到型式核准测试,关注触发链路、备用电源、GNSS定位、MSD字段、音频质量与回拨能力。工程落地需要围绕测试模式、字段校验、配置管理和送检样件建立可交付合规方案。

weixin_31815843的博客 209

Windows下的Geant4安装教程

本教程将从0开始展示在Windows下如何安装Geant4,包括各种辅助工具(QT、Cmake、Visual Studio)的下载安装,环境变量的配置,以及example的生成等。

weixin_49065278的博客 4106

【iOS】—— isMemberOfClass & isKindOfClass以及源码

类方法:元类 --> 根元类 --> 根类 --> nil 与 传入类的对比。实例方法:对象的类 --> 父类 --> 根类 --> nil 与 传入类的对比。类方法: 类的元类 与 传入类对比。实例方法:对象的父类 与 传入类对比。通过上面的源码解析分析代码:ret1 = 1,传入的cls为NSObject,self指的是NSObject,进入循环。

qq_72437394的博客 1271

【嵌入式 – GD32开发实战指南(ARM版本)】第1部分 基础篇 - 第1章 开发环境搭建

开发环境: MDK:Keil 5.30 MCU:GD32F207IK 1.1 GD32F207I-EVAL开发板简介 笔者使用的开发板是兆易创新设计的GD32F207I-EVAL开发板。 GD32F207I-EVAL开发板使用 GD32F207IK作为主控制器,主频120MHz、集成3MB Flash、256KB SRAM、通用定时器*10、Adv. TM*2、Basic TM*2、系统时钟*1、看门狗*2、RTC*1、USART*4、UART*4、I2C*3、SPI*3、I2S*1、SDIO*1、CAN

不问归期的博客 9987

IOS动态类型isKindOfClass, isMemberOfClass

对象在运行时获取其类型的能力称为内省。内省可以有多种方法实现。 判断对象类型 -(BOOL) isKindOfClass: classObj判断是否是这个类或者这个类的子类的实例 -(BOOL) isMemberOfClass: classObj 判断是否是这个类的实例 我们试试这两个方法的使用。 1、新建Person类继承NSObject,新建Teacher类继承Person 1.1

曲奇 3万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

isMemberOfClass和isKindOfClass

isa 是 NSObject 基类定义的一个指针属性(实际由编译器自动生成),用于标识对象的类类型或元类型。通过 isa指针,对象可以找到其所属的类,类可以找到其所属的元类,元类最终指向根元类,形成一条类型链。继承链是指从子类到根类(NSObject的类层级关系。当调用对象的方法或属性时,会沿着继承链向上查找,直到找到对应的实现或到达根类。isMemberOfClass和isKindOfClass最大的区别还是在于比较的是两个类是否相同还是当前类和对比类自身或其子类相同。

2401_87841908的博客 793

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

iOS 动态类型isKindOfClass, isMemberOfClass

对象在运行时获取其类型的能力称为内省。内省可以有多种方法实现。 这些知识是看别的博主写的,然后自己理解再写一遍。 新建两个类,Person,Teacher。Teacher继承与Person。 1.Person类 [objc] view plaincopy //   //  Person.h   //  iOS动态类型  

MGY_my的博客 677

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

iOS:isMemberOfClass、isKindOfClass知多少

1.Returns a Boolean value that indicates whether the receiver is an instance of a given class. 返回一个布尔值,指示接收者是否是给定类的实例。 - (BOOL)isMemberOfClass:(Class)aClass; For example, in this code,isMemberOf...

Bruce's Blog 296

iOS 底层原理探索之 isKindOfClass & isMemberOfClass

isMemberOfClass 今天通过两个经典面试题,继续加深对isa & 继承关系 & 类结构的理解。 在之前的isa探索中,我们了解了:isa的指向:对象的 isa 指向 类; 类的 isa 指向 元类;元类的 isa 指向 根元类;根元类的 isa 指向 自己。类的superclass的指向:类的 superclass 指向 父类, 父类的 superclass 指向 根类 ,根类的superclass 指向 nil;元类的superclass的指向:元类的 superclass .

u013712343的博客 470

[iOS]isKindOfClass、isMemberOfClass、isSubclassOfClass

最近招聘了一段时间,有些面试者我会提到 isKindOfClass 和 isMemberOfClass 的区别和使用场景。来的人很少有能答对的,我觉得这是很基础的东西,所以在这里简单的用代码加说明的形式列出来。 【其实我个人觉得,从方法的名称就已经能猜出他们之间的区别了。^_^】 @interface SuperClass : NSObject @end @implementation Sup

神奇的芋頭(http://blog.youkuaiyun.com/liuyu1114) 981

iOS开发中isKindOfClass、isMemberOfClass和isSubclassOfClass的区别与使用场景

举个例子,如果有一个继承链W->X->Y->Z,那么Z的实例调用isKindOfClass判断是否为W、X、Y、Z类时都会返回YES。继续上面的例子,Z的实例调用isMemberOfClass判断时,只有参数是Z类才会返回YES,对于W、X、Y类都会返回NO。这是一个类方法,用于判断一个类是否是另一个类的子类或相同类。理解这些方法的区别不仅能帮助我们写出更准确的代码,还能避免一些潜在的类型判断错误。在实际项目中,我建议多写些测试用例来验证自己对这三种方法的理解,特别是在复杂的继承关系中。

PurpleRain89的博客 415

iOS之isKindOfClass与isMemberOfClass、isSubclassOfClass的总结

先看官方文档: 一、isKindOfClass 实例方法 - (BOOL)isKindOfClass:(Class)aClass Description Returns a Boolean value that indicates whether the receiver is an instance of given class or an instance of any class that inherits from that class. (required) //意思是返回一个B...

C_philadd的博客 1054

iOS开发-isKindOfClass和isMemberOfClass

文章目录前言源码 前言 isKindOfClass和isMemberOfClass多多少少都用过 isKindOfClass 方法调用者是传入的类的实例对象,或者调用者是传入类的继承者链中的类的实例对象,则返回YES。 isMemberOfClass: returns YES if the receiver is an instance of the specified class. 方法调用者...

CaicaiNo.1 479

【iOS】isKindOfClass & isMemberOfClass比较

isKindOfClass 类方法是从当前类的isa指向 (也就是当前类的元类) 开始,沿着 superclass 继承链查找判断和对比类是否相等。-isKindOfClass 对象方法是从 [self class] (当前类) 开始,沿着 superclass 继承链查找判断和对比类是否相等。+isMemberOfClass 类方法是直接判断当前类的isa指向 (也就是当前类的元类) 和对比类是否相等。结合上一篇博客以及给出的结论,我们可以很容易分析出输出0或1的原因。

weixin_72437555的博客 513

【iOS_Development】isKindOfClass && isMemberOfClass

API文档 isKindOfClass: Returns a Boolean value that indicates whether the receiver is an instance of given class or an instance of any class that inherits from that class. (required)isMemberOfClass:

Anticipte_91的博客 626

iOS isKindOfClass与isMemberOfClass的区别

先看一下官方文档的说法 isKindOfClass: Returns a Boolean value that indicates whether the receiver is an instance of given class or an instance of any class that inherits from that class. //调用者是给定类的实例或者是给定类的子类的实...

weixin_34260991的博客 303
上一篇: AFNetworking的作用以及详细用法
下一篇: GCD 多线程(1)
kintan哥
博客等级 码龄12年 11粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值