黑客技术点击右侧关注,了解黑客的世界!

Java开发进阶点击右侧关注,掌握进阶之路!

Python开发点击右侧关注,探讨技术话题!作者丨OSMin链接:https://juejin.im/post/5e1c36fcf265da3df47adc1f

1.一个参数取地址了,一个没有,两种写法是一样的,只是语法不同的问题。

2.元类的递归问题:

通过函数传入,表,isa,如果存在返回cls元类,不存在返回c2是nil如果没有下标idx,存一份,有则返回NX_,回到第二步骤

3.面试题:类的创建 ro rw

(1)实例:

注意:

1.先添加成员变量再注册内存,如果先注册内存,就会调用changinfo,如下图返回NO,无法继续往下走,无法添加ivar // : 添加成员变量 1<

    // cls->ISA()->changeInfo(RW_CONSTRUCTED, RW_CONSTRUCTING | RW_REALIZING);    // cls->changeInfo(RW_CONSTRUCTED, RW_CONSTRUCTING | RW_REALIZING);

2.:先添加set,get方法才能调用setValue forKey,否则报错 无法添加进去。添加setter + getter 方法 class_addMethod(LGPerson, @selector(setSubject:), (IMP)lgSetter, "v@:@"); class_addMethod(LGPerson, @selector(subject), (IMP)lgName, "@@:");

    // 开始使用    id person = [LGPerson alloc];    [person setValue:@"KC" forKey:@"lgName"];    NSLog(@"%@",[person valueForKey:@"lgName"]);

ro - rw - 类的动态创建面试题

    // 1: 动态创建类    Class LGPerson = objc_allocateClassPair([NSObject class], "LGPerson", 0);    // 2: 添加成员变量 1<    // ivar - ro - ivarlist    class_addIvar(LGPerson, "lgName", sizeof(NSString *), log2(sizeof(NSString *)), "@");    // 3: 注册到内存    objc_registerClassPair(LGPerson);    // cls->ISA()->changeInfo(RW_CONSTRUCTED, RW_CONSTRUCTING | RW_REALIZING);    // cls->changeInfo(RW_CONSTRUCTED, RW_CONSTRUCTING | RW_REALIZING);    // 3.1 添加property - rw    lg_class_addProperty(LGPerson, "subject");    lg_printerProperty([LGTeacher class]);    lg_printerProperty(LGPerson);    // 3.2 添加setter  +  getter 方法    class_addMethod(LGPerson, @selector(setSubject:), (IMP)lgSetter, "v@:@");    class_addMethod(LGPerson, @selector(subject), (IMP)lgName, "@@:");    // 开始使用    id person = [LGPerson alloc];    [person setValue:@"KC" forKey:@"lgName"];    NSLog(@"%@",[person valueForKey:@"lgName"]);    id teacher = [LGTeacher alloc];    [teacher setValue:@"iOS" forKey:@"subject"];    NSLog(@"%@",[teacher valueForKey:@"subject"]);    [person setValue:@"master" forKey:@"subject"];    NSLog(@"%@",[person valueForKey:@"subject"]);

相关api 的注释

 * 创建类对 *superClass: 父类,传Nil会创建一个新的根类 *name: 类名 *extraBytes: 0 *return:返回新类,创建失败返回Nil,如果类名已经存在,则创建失败  objc_allocateClassPair(, , ) *//** *添加成员变量 * *cls 往哪个类添加 *name 添加的名字 *size 大小 *alignment 对齐处理方式 *types 签名 * *这个函数只能在objc_allocateClassPair和objc_registerClassPair之前调用。不支持向现有类添加一个实例变量。 *这个类不能是元类。不支持在元类中添加一个实例变量。 *实例变量的最小对齐为1 << align。实例变量的最小对齐依赖于ivar的类型和机器架构。对于任何指针类型的变量,请通过log2(sizeof(pointer_type))。  class_addIvar(, , , , ) *//** *往内存注册类 * * cls 要注册的类 * * objc_registerClassPair() *//** *往类里面添加方法 * *cls 要添加方法的类 *sel 方法编号 *imp 函数实现指针 *types 签名 * *class_addMethod(, , , ) *//** *往类里面添加属性 * *cls 要添加属性的类 *name 属性名字 *attributes 属性的属性数组。 *attriCount 属性中属性的数量。 * *class_addProperty(, , , ) */

4.懒加载类和非懒加载类的区别

属非懒加载类直接走上节课的realizeClassWithoutSwift 去加载数据,懒加载类 在lookupimpOrforward 中 有 if (!cls->isRealized())判断条件,如果用到时候没有实现过则进入实现流程,如果实现过则跳过判断,进行下面的流程。if (!cls->isRealized()) { cls = realizeClassMaybeSwiftAndLeaveLocked(cls, runtimeLock); // runtimeLock may have been dropped but is now locked again }

5.类和分类的搭配分析

1.懒加载类 + 非懒加载分类

主类在发送消息的时候才有 — 但是分类提前了 — 需要加载 —-read_image —addUnattacheCategoryForClass —但是没有实现类 ——prepare_load_methods —提前实现了主类realizeClassWithoutSwift

2.非懒加载类 + 非懒加载分类

readImages — realizeClassWithoutSwift —— methodLizeClass — addUnattacheCategoryForClass —判断主类是否实现了,但是这时候主类已经实现了,if(cls —> isRealize){ remethodizeClass }加载分类进来cls —-> demangleName () 用这个,不能用Name addUnattachedCategoryForClass(cat, cls, hi); const char *cname = ro->name; const char *oname = "LGTeacher";//LGTeacher if (cname && (strcmp(cname, oname) == 0)) { // printf("_read_images - _getObjc2ClassList 类名 :%s - %p\n",cname,cls); }if(cls —> isRealize) { remethodizeClass(cls); classExists == YES; }分类没有实现load —— 编译处理 — data() —> ro

3.非懒加载类 + 懒加载分类

readImages — realizeClassWithoutSwift —— methodLizeClass — 不需要添加表 ——直接 data() ——> ro

4.懒加载类 + 懒加载分类

消息发送的时候 ——lookupImpOrForward —— realizeClassWithoutSwift —— methodLizeClass — addUnattacheCategoryForClass 不进来 ——直接走data()

 推荐↓↓↓ 

?16个技术公众号】都在这里!

涵盖:程序员大咖、源码共读、程序员共读、数据结构与算法、黑客技术和网络安全、大数据科技、编程前端、Java、Python、Web编程开发、Android、iOS开发、Linux、数据库研发、幽默程序员等。

万水千山总是情,点个 “在看” 行不行

懒加载和预加载的区别_类的动态创建(ro,rw)amp; 懒加载类和非懒加载类底层加载的区别 amp; 类和分类的搭配分析...相关推荐

  1. C# Activator的使用(类工厂动态创建类的实例)

    包含特定的方法,用以在本地或从远程创建对象类型,或获取对现有远程对象的引用.此类不能被继承--c# Activator c#在类工厂中动态创建类的实例 1. Activator.CreateInsta ...

  2. Python基础笔记_Day12_Python元类、type动态创建类、Python动态创建方法、Python运算符、Python发邮件、短信

    Day12_Python元类.type动态创建类.Python动态创建方法.Python运算符重载.Python发邮件.短信 12.01_Python语言基础(类对象)(熟悉) 12.02_Pytho ...

  3. javascript图片懒加载与预加载的分析

    懒加载与预加载的基本概念. 懒加载也叫延迟加载:前一篇文章有介绍:JS图片延迟加载 延迟加载图片或符合某些条件时才加载某些图片. 预加载:提前加载图片,当用户需要查看时可直接从本地缓存中渲染. 两种技 ...

  4. jquery 当页面图片加载之后_图片的懒加载和预加载

    一.懒加载 [1.1]什么是懒加载? 懒加载也就是延迟加载,指的是在长网页中延迟加载图像,是一种很好优化网页性能的方式.当访问一个页面的时候,先把img元素或是其他元素的背景图片路径替换成一张大小为1 ...

  5. 页面优化之懒加载与预加载

    1.前言 PC端网速较快,现在普通都是百兆宽带,那么折算一下就是10M/s的下载速度,基本上资源如果在10M以内的话加载还是比较快的. 但是移动端就不行了.移动端需要消耗巨额的流量,所以尽量减少移动端 ...

  6. css 同步加载,同步加载,异步加载,懒加载,预加载

    同步加载 默认的就是同步加载 同步加载: 同步模式又称阻塞模式,会阻止浏览器的后续处理,停止了后续的文件的解析,执行,如图像的渲染.流览器之所以会采用同步模式,是因为加载的js文件中有对dom的操作, ...

  7. img加载本地图片_图片加载技术-懒加载和预加载

    懒加载也就是延迟加载. 具体表现为: 当访问一个页面的时候,先把img元素或是其他元素的背景图片路径替换成一张占位图的路径,这样就只需请求一次,只有当图片出现在浏览器的可视区域内时,才设置图片正真的路 ...

  8. 图片的懒加载和预加载?

    一.写在前面 图片的懒加载和图片的预加载都是前端性能优化的一个方案,当然可能存在不同的应用场景,下面我们将总结一下这两个方案. 二.图片懒加载 图片的懒加载是什么? 图片的懒加载指的是在长网页中延迟加 ...

  9. Jquery图片懒加载和预加载

    Jquery图片懒加载和预加载 懒加载 1.什么是懒加载 Lazy Load也叫懒加载,延迟加载,顾名思义,就是在图片未到达可视区域时,不加载图片,我们常常在很多的优秀网站上看到类似的例子,例如迅雷. ...

最新文章

  1. mysql 存储过程基础_MySQL基础-存储过程
  2. H3C交换机版本升级(图形化)
  3. Python Requests 简明教程
  4. Android --- Add Google Maven repository and sync project
  5. Spark2.3.0的DataFrame去哪了,DataSet是哪位?
  6. Vue.js2.0核心思想
  7. java boolean if_Java if(boolean)和if(boolean=true)区别解析
  8. [转载] Python中字符串的处理方法
  9. html双击单元格修改,JS实现鼠标双击选中表格单元格代码
  10. Thrift IDL使用方式
  11. shell获取系统当前时间、本月1日、下月1日、本月月底、上月月底、上月同期日期
  12. 分段函数求导数,为什么分段点处一般用导数的定义求导
  13. Houdini图文笔记:Could not create OpenCL device of type (HOUDINI_OCL_DEVICETYPE)问题的解决
  14. 自定义gerrit提交脚本
  15. 类和对象常见题目详解
  16. 你的价值在哪里 (侯捷)
  17. 教你成为婚礼上最闪耀的明星
  18. 蛋花花谈人工智能是否会成为植物保护伞
  19. UE4/UE5 虚幻引擎,动画篇(四)骨骼重定向,重定向动画资产
  20. SQL-MSSQL大全

热门文章

  1. android个人理财通项目_怎么开通微信理财通,利用闲钱赚收益
  2. 计算机与程序设计基础 vb,《VB程序设计基础》第4章 函数与过程
  3. 获取android型号代码,Android应用开发之Android获取手机品牌、手机型号、手机唯一序列号的代码教程...
  4. 21天Jmeter打卡Day19 mysql数据库提取参数化
  5. 毕业5年跳槽24次,为什么这届95后换工作越来越勤?
  6. 交换机tftp服务器修改ip,华为交换机tftp服务器地址
  7. html给主题设置背景色,css如何设置元素的背景色?
  8. mysql索引统计信息更新_MySQL索引统计信息更新相关的参数
  9. PAT甲级1051 栈的模拟
  10. java中选择结构有哪些_Java中的选择结构