懒加载和预加载的区别_类的动态创建(ro,rw)amp; 懒加载类和非懒加载类底层加载的区别 amp; 类和分类的搭配分析...
黑客技术点击右侧关注,了解黑客的世界!
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; 类和分类的搭配分析...相关推荐
- C# Activator的使用(类工厂动态创建类的实例)
包含特定的方法,用以在本地或从远程创建对象类型,或获取对现有远程对象的引用.此类不能被继承--c# Activator c#在类工厂中动态创建类的实例 1. Activator.CreateInsta ...
- Python基础笔记_Day12_Python元类、type动态创建类、Python动态创建方法、Python运算符、Python发邮件、短信
Day12_Python元类.type动态创建类.Python动态创建方法.Python运算符重载.Python发邮件.短信 12.01_Python语言基础(类对象)(熟悉) 12.02_Pytho ...
- javascript图片懒加载与预加载的分析
懒加载与预加载的基本概念. 懒加载也叫延迟加载:前一篇文章有介绍:JS图片延迟加载 延迟加载图片或符合某些条件时才加载某些图片. 预加载:提前加载图片,当用户需要查看时可直接从本地缓存中渲染. 两种技 ...
- jquery 当页面图片加载之后_图片的懒加载和预加载
一.懒加载 [1.1]什么是懒加载? 懒加载也就是延迟加载,指的是在长网页中延迟加载图像,是一种很好优化网页性能的方式.当访问一个页面的时候,先把img元素或是其他元素的背景图片路径替换成一张大小为1 ...
- 页面优化之懒加载与预加载
1.前言 PC端网速较快,现在普通都是百兆宽带,那么折算一下就是10M/s的下载速度,基本上资源如果在10M以内的话加载还是比较快的. 但是移动端就不行了.移动端需要消耗巨额的流量,所以尽量减少移动端 ...
- css 同步加载,同步加载,异步加载,懒加载,预加载
同步加载 默认的就是同步加载 同步加载: 同步模式又称阻塞模式,会阻止浏览器的后续处理,停止了后续的文件的解析,执行,如图像的渲染.流览器之所以会采用同步模式,是因为加载的js文件中有对dom的操作, ...
- img加载本地图片_图片加载技术-懒加载和预加载
懒加载也就是延迟加载. 具体表现为: 当访问一个页面的时候,先把img元素或是其他元素的背景图片路径替换成一张占位图的路径,这样就只需请求一次,只有当图片出现在浏览器的可视区域内时,才设置图片正真的路 ...
- 图片的懒加载和预加载?
一.写在前面 图片的懒加载和图片的预加载都是前端性能优化的一个方案,当然可能存在不同的应用场景,下面我们将总结一下这两个方案. 二.图片懒加载 图片的懒加载是什么? 图片的懒加载指的是在长网页中延迟加 ...
- Jquery图片懒加载和预加载
Jquery图片懒加载和预加载 懒加载 1.什么是懒加载 Lazy Load也叫懒加载,延迟加载,顾名思义,就是在图片未到达可视区域时,不加载图片,我们常常在很多的优秀网站上看到类似的例子,例如迅雷. ...
最新文章
- mysql 存储过程基础_MySQL基础-存储过程
- H3C交换机版本升级(图形化)
- Python Requests 简明教程
- Android --- Add Google Maven repository and sync project
- Spark2.3.0的DataFrame去哪了,DataSet是哪位?
- Vue.js2.0核心思想
- java boolean if_Java if(boolean)和if(boolean=true)区别解析
- [转载] Python中字符串的处理方法
- html双击单元格修改,JS实现鼠标双击选中表格单元格代码
- Thrift IDL使用方式
- shell获取系统当前时间、本月1日、下月1日、本月月底、上月月底、上月同期日期
- 分段函数求导数,为什么分段点处一般用导数的定义求导
- Houdini图文笔记:Could not create OpenCL device of type (HOUDINI_OCL_DEVICETYPE)问题的解决
- 自定义gerrit提交脚本
- 类和对象常见题目详解
- 你的价值在哪里 (侯捷)
- 教你成为婚礼上最闪耀的明星
- 蛋花花谈人工智能是否会成为植物保护伞
- UE4/UE5 虚幻引擎,动画篇(四)骨骼重定向,重定向动画资产
- SQL-MSSQL大全
热门文章
- android个人理财通项目_怎么开通微信理财通,利用闲钱赚收益
- 计算机与程序设计基础 vb,《VB程序设计基础》第4章 函数与过程
- 获取android型号代码,Android应用开发之Android获取手机品牌、手机型号、手机唯一序列号的代码教程...
- 21天Jmeter打卡Day19 mysql数据库提取参数化
- 毕业5年跳槽24次,为什么这届95后换工作越来越勤?
- 交换机tftp服务器修改ip,华为交换机tftp服务器地址
- html给主题设置背景色,css如何设置元素的背景色?
- mysql索引统计信息更新_MySQL索引统计信息更新相关的参数
- PAT甲级1051 栈的模拟
- java中选择结构有哪些_Java中的选择结构