isKindOfClass和isMemberOfClass 区别

isKindOfClass和isMemberOfClass 都是NSObject的比较Class的方法。

但两个有很大区别:

isKindOfClass来确定一个对象是否是一个类的成员,或者是派生自该类的成员。

isMemberOfClass只能确定一个对象是否是当前类的成员。

例如:

NSArray *arr1 = [NSArrayarray];
NSArray *arr2 = [NSArrayarray];
NSObject *ob = [[NSObjectalloc] init];

NSLog(@"%hhd", [[NSArrayarray] isKindOfClass:[NSObjectclass]]); // YES
NSLog(@"%hhd", [[NSArrayarray] isMemberOfClass:[NSArrayclass]]); // NO
NSLog(@"%hhd", [arr1 isKindOfClass:[ob class]]); // YES
NSLog(@"%hhd", [arr1 isMemberOfClass:[ob class]]); // NO
NSLog(@"%hhd", [arr1 isKindOfClass:[arr2 class]]); // YES
NSLog(@"%hhd", [arr1 isMemberOfClass:[arr2 class]]); // YES

[[NSArrayarray] isMemberOfClass:[NSArrayclass]]返回NO的原因在于NSArray是一个类簇,意味着每个NSArray的实例都是NSArray内部子类的一个实例,我们会发现[[NSArrayarray] class]返回值为__NSArray0, 而[NSArray class]返回值为NSArray,所以二者不等。

关于NSArray类簇,请查看http://blog.sunnyxx.com/2014/12/18/class-cluster/

时间: 2024-08-28 23:09:03

isKindOfClass和isMemberOfClass 区别的相关文章

isKindOfClass和isMemberOfClass的区别

isKindOfClass和isMemberOfClass的区别 isKindOfClass和isMemberOfClass 都是NSObject的比较Class的方法 但两个有很大区别: isKindOfClass来确定一个对象是否是一个类的成员,或者是派生自该类的成员 isMemberOfClass只能确定一个对象是否是当前类的成员 例如:我们已经成NSObject派生了自己的类,isMemberOfClass不能检测任何的类都是基于NSObject类这一事实,而isKindOfClass可

OC中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. isMemberOfClass:Returns a Boolean value that indicates whether the receiver is

isKindOfClass和isMemberOfClass

https://github.com/ming1016/study/wiki/Objc-Runtime 先看看isKindOfClass和isMemberOfClass在Object.mm中的实现 - (BOOL)isKindOf:aClass { Class cls; for (cls = isa; cls; cls = cls->superclass) if (cls == (Class)aClass) return YES; return NO; } - (BOOL)isMemberOf:

isKindOfClass和isMemberOfClass 的区别

判断对象类型 -(BOOL) isKindOfClass: classObj判断是否是这个类或者这个类的子类的实例 -(BOOL) isMemberOfClass: classObj 判断是否是这个类的实例 测试实例: 新建Person类继承NSObject,新建Teacher类继承Person 新建Person类: #import <Foundation/Foundation.h> @interface Person : NSObject { NSString *name; } -(void

isKindOfClass,isMemberOfClass

- (BOOL)isKindOfClass:(Class)aClass; - (BOOL)isMemberOfClass:(Class)aClass; 特点: 1.isKindOfClass   判断是否是这个类(包括其父类及根类)或者这个类的子类的实例 2. isMemberOfClass  判断是否是这个类的实例 3.二者都可以判断是否是这个类

isKindOfClass:和isMemberOfClass:-b

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) isKindOfClass能确定一个对象是否是一个类的成员,或者是派生自该类的成员 isMemberOfClass: Returns a Boolea

iOS 知识点梳理

OC的理解与特性 OC作为一门面向对象的语言,自然具有面向对象的语言特性:封装.继承.多态.它既具有静态语言的特性(如C++),又有动态语言的效率(动态绑定.动态加载等).总体来讲,OC确实是一门不错的编程语言, Objective-C具有相当多的动态特性,表现为三方面:动态类型(Dynamic typing).动态绑定(Dynamic binding)和动态加载(Dynamic loading).动态——必须到运行时(run time)才会做的一些事情. 动态类型:即运行时再决定对象的类型,这

iOS 面试常见问题最全梳理

序言 目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了.今年,找过工作人可能会更深刻地体会到今年的就业形势不容乐观,加之,培训机构一火车地向用人单位输送iOS开发人员,打破了生态圈的动态平衡.矫情一下,言归正传,我奉献一下,为iOS应聘者梳理一下面试题,希望能助一臂之力! OC的理解与特性 OC作为一门面向对象的语言,自然具有面向对象的语言特性:封装.继承.多态.它既具有静态语言的特性(如C++),又有动态语言的效率(动态绑定.动态加载等).总体来讲,OC确实是一门不错的编程语言,

iOS开发之Runtime机制深入解析

本篇主要讲述在 OC 开发中主要涉及到的运行时机制: 运行时的工作: 运行时在 OC 中的工作:OC 语言的设计模式决定了尽可能的把程序从编译和链接时推迟到运行时.只要有可能,OC 总是使用动态的方式来解决问题.这意味着 OC 语言不仅需要一个编译器,同时也需要一个运行时系统来执行编译好的代码.这儿的运行时系统扮演的角色类似于 OC 语言的操作系统,OC 基于该系统来工作.  运行时的简单应用: OC 2.0运行时系统参考库描述了OC 运行库的数据结构和函数接口.程序可以通过这些接口来和 OC