ios-面试

ios-面试-了解NSObject类

2019-12-03  本文已影响0人  简鱼7819

在Objective-C中创建一个类,基本上继承NSObject,那么NSObject中又是如何实现的呢。

苹果开源代码

@interface NSObject <NSObject> {  

    #pragma clang diagnostic push

    #pragma clang diagnostic ignored "-Wobjc-interface-ivars" 

         Class isa OBJC_ISA_AVAILABILITY; 

    #pragma clang diagnostic pop

}

其中Class实际上是一个指向objc_class结构体的指针,isa是Class的对象,是指向objc_class结构体的指针。

其中objc_class结构体具体如下⏬

objc_class

其中objc_ivar_list是该类中所有的属性列表,其中字典转model,字典根据key取值,KVC赋值都需要这个列表

其中objc_method_list是该类所有的方法列表,习惯做逆向分析可以说经常用到这个列表。获取这个列表就是C语言实现的API,需要做手动内存管理。

其中objc_cache,这个cache主要缓存常用的方法列表,它也是提高OC运行效率的一种缓存。要是没有这个方法缓存,该类所用的方法都要去遍历objc_method_list去获取,方法个数很多的情况,是比较影响运行效率的。

类调用方法发逻辑:【先判断cache是否为空,为空就从objc_method_list去获取,并把获取的方法缓存到cache中;如果cache不为空,那先从cache中找要调用的方法,有就返回,没有继续遍历objc_method_list来获取】,这个缓存机制我们平常开发也会用到,比较好理解。

其中objc_protocol_list,是该类遵循的协议。比如NSString继承NSObject,遵循了NSCopying, NSMutableCopying, NSSecureCoding三个协议,那么其他继承NSString实现的类,也会遵循这个三个协议,objc_protocol_list会自动添加这三个协议。

这其中涉及一个知识点MetaClass元类,

Class _Nonnull isa OBJC_ISA_AVAILABILITY;

Class的对象isa,其实是一个指针,指向Class对应的objc_class这个结构体。而objc_class就是Class的元类MetaClass,也是最终的RootMetaCalss。这个有点像我们刚学类型的继承时,书本举了很多例子。superFatherClass --> fatherClass -->sunClass,最终的sunClass能够调用superFatherClass已经声名的属性和实现的方法。sunClass这个类创建的对象sun,这个对象sun指针能够通过super_class一级一级找到自己的MetaClass,最终是RootMetaCalss。objc_class这个结构体大概就是最终的终点。

遇到,记录,分享~~

有说的不对的,请留言,感谢大神莅临指点!

参考资料https://www.jianshu.com/p/8b833813ed62

参考资料https://www.jianshu.com/p/291754a90d2b

上一篇下一篇

猜你喜欢

热点阅读