了解NSObject实现文件(二)

本文详细解析了Objective-C运行时的多个核心方法,包括类成员判断、方法响应性检查、协议遵循验证、hash与等价性判断以及消息发送机制。通过对NSObject方法实现的探讨,揭示了Objective-C运行时的底层原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.- (BOOL)isMemberOfClass:(Class)cls和- (BOOL)isKindOfClass:(Class)cls,都是判断class是否相等,cls这里我们暂且称之为传入类。区别在于isMemberOfClass只将传入类和当前类做了一次比较,而isKindOfClass是将传入类及类向上的继承体系与当前类逐一比较。

所以isMemberOfClass用于判断传入类与当前类是否属于同一个类,而isKindOfClass则用于判断传入类与当前类是否属于同一个类或属于其派生类。

2.+ (BOOL)instancesRespondToSelector:(SEL)sel、+ (BOOL)respondsToSelector:(SEL)sel、- (BOOL)respondsToSelector:(SEL)sel判断是否存在sel的实现方法

 

其最后都是调用bool class_respondsToSelector_inst(Class cls, SEL sel, id inst)方法

在class_respondsToSelector_inst方法中,会调用IMP lookUpImpOrNil(Class cls, SEL sel...)寻找IMP,其简要过程是:

cache_getImp(在缓存的方法列表中寻找)->getMethodNoSuper_nolock(在cls以及其父类的方法列表中寻找)。

三个方法的不同点就在于传入的cls,+ (BOOL)instancesRespondToSelector:(SEL)sel、- (BOOL)respondsToSelector:(SEL)sel方法传入的cls都是类本身,而类本身包含实例对象的方法列表,所以这两个方法实现的都是对实例方法的判断。而+ (BOOL)respondsToSelector:(SEL)sel方法传入的cls是指向元类的isa,元类中包含类方法列表,所以实现了对类方法的判断。

 

3.+ (BOOL)conformsToProtocol:(Protocol *)protocol和- (BOOL)conformsToProtocol:(Protocol *)protocol,用于判断某一个实例对象或者类是否遵循某一个协议,只要遵循了协议即使没有实现,也会返回yes。

其通过BOOL class_conformsToProtocol(Class cls, Protocol *proto_gen)方法,从self及其向上的继承体系包含的class结构体的protocols中寻找。(class结构在系列一中有贴图)

4.+ (NSUInteger)hash、- (NSUInteger)hash、+ (BOOL)isEqual:(id)obj、- (BOOL)isEqual:(id)obj

hash在NSObject中的实现非常简单->(uintptr_t)obj,直接将对象转成unsigned long类型,其可以看成一个identifier,但这个值不一定唯一(散列冲突),在NSSet或NSDictionary中hash被用来定位内存位置。而isEqual则用于判断两个obj是否为同一个对象。当我们判断两个对象是否相等时一般会重写isEqual方法,其中可以把hash值是否相等当做判断条件之一(两个对象如果相等则hash值一定相同,反正则不一定)。

5.+ (id)performSelector:(SEL)sel、- (id)performSelector:(SEL)sel...其它类似方法,都是用于执行某一sel的,调用了runtime最核心的方法objc_msgSend,还会涉及到消息转发这一过程,涉及到+ (BOOL)resolveInstanceMethod:(SEL)sel、- (void)forwardInvocation:(NSInvocation *)invocation、- (id)forwardingTargetForSelector:(SEL)sel等转发处理。详情可看我之前写的《OC runtime之消息转发》

至此NSObject实现文件中绝大部分方法都有过提及与解分析,部分没有提及的可以自行下载《objc4-750》了解。由于水平有限,如有描述错误地方,请留言指正,感谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值